Làm thế nào để thay đổi một cột và thay đổi giá trị mặc định?


189

Tôi đã gặp lỗi sau khi cố gắng thay đổi loại dữ liệu của cột và đặt giá trị mặc định mới:

ALTER TABLE foobar_data ALTER COLUMN col VARCHAR(255) NOT NULL SET DEFAULT '{}';

LRI 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'VARCHAR (255) KHÔNG NULL SET DEFAULT' {} '' ở dòng 1


Tôi không nghĩ rằng bạn cần THIẾT LẬP trước khi DEFAULT
Jonas T

Câu trả lời:


273
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Khả năng thứ hai cũng tương tự (nhờ juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';

9
Đây columnlà tùy chọn. Bạn chỉ có thể sử dụng ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';hoặc ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';kết quả sẽ giống nhau.
kapad

1
Đó là chuỗi mặc định mà OP yêu cầu. Khi bạn chỉ định không có giá trị cho cột này khi chèn một hàng, giá trị sẽ trở thành {}.
FancyPants

1
Viết hai cols cạnh nhau có đúng không? (như thế này col col)
Shafizadeh

4
@Shafizadeh Vâng, đúng vậy. Điều này cung cấp khả năng đổi tên một cột. Đầu tiên là tên gốc, thứ hai là tên mới.
FancyPants

3
Đừng sử dụng cái này nếu bạn chỉ cần thay đổi DEFAULTgiá trị. Điều này sẽ xử lý tất cả các hàng của bảng không có gì (rất dài trên các bảng lớn). Sử dụng thay thế ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>đó là ngay lập tức.
heo

113

Theo dõi, nếu bạn chỉ muốn đặt mặc định, khá chắc chắn rằng bạn có thể sử dụng cú pháp ALTER .. SET. Chỉ cần không đặt tất cả những thứ khác trong đó. Nếu bạn sẽ đặt phần còn lại của định nghĩa cột vào, hãy sử dụng cú pháp MODIFY hoặc CHANGE theo câu trả lời được chấp nhận.

Dù sao, cú pháp ALTER để đặt mặc định cột, (vì đó là điều tôi đang tìm kiếm khi đến đây):

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'literal';

Mà 'nghĩa đen' cũng có thể là một số (ví dụ ...SET DEFAULT 0). Tôi đã không thử nó ...SET DEFAULT CURRENT_TIMESTAMPnhưng tại sao không?


5
Ngoài ra current_timestamp đã không làm việc cho tôi nếu được trích dẫn. Tôi đã phải sử dụng như sau:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1 Câu trả lời tốt nhất cho tôi, vì theo cách đó, tôi không cần chỉ định loại cột và những thứ khác sẽ không thay đổi!
dùng2342558

2
Đây là câu trả lời hiệu quả để chỉ thay đổi DEFAULTgiá trị.
heo

1
Nếu bạn muốn giá trị mặc định là thời gian chèn, hãy sử dụng NOW()hoặc current_timestamp()@Malaise @Nereis
BlueCacti

16

Nếu bạn muốn thêm giá trị mặc định cho cột đã được tạo, điều này hoạt động với tôi:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
Đây là câu trả lời tốt nhất vì bạn không cần phải sao chép đặc tả trường hiện có.
rjh

4

Đối với DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 CHANGE COLUMN columnname1 columname1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 CHANGE COLUMN columnname2 columname2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Xin lưu ý khai báo tên cột đôi

Xóa DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;

Tại sao tên cột đôi?
MKJ

2
ALTER TABLE tablename THAY ĐỔI COLUMN oldColName newColName cột Định nghĩa
Leonard Lepadatu

1

Chấp nhận trả lời hoạt động tốt.

Trong trường hợp sử dụng không hợp lệ lỗi giá trị NULL , trên các giá trị NULL , cập nhật tất cả các giá trị null thành giá trị mặc định trong cột đó và sau đó thử thực hiện thay đổi.

UPDATE foobar_data SET col = '{}' WHERE col IS NULL;

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Những gì tôi cần. Cảm ơn
tấn công

0

Trong trường hợp ở trên không phù hợp với bạn (ví dụ: bạn đang làm việc với SQL hoặc Azure mới ), hãy thử cách sau:

1) loại bỏ ràng buộc cột hiện có (nếu có):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) tạo một cái mới:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;

0

Thử cái này

ALTER TABLE `table_name` CHANGE `column_name` `column_name` data_type  NULL DEFAULT '';

như thế này

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.