如何更改列并更改默认值?


189

尝试更改列的数据类型并设置新的默认值时遇到以下错误:

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

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的'VARCHAR(255)NOT NULL SET DEFAULT'{}''附近使用正确的语法


我认为您不需要在DEFAULT之前设置
Jonas T

Answers:


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

同样的第二种可能性(感谢juergen_d):

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

9
column是可选的。您可以只使用ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';,结果将相同。
kapad

1
这是OP要求的默认字符串。当您在插入行时未为此列指定任何值时,该值将变为{}
fancyPants

1
col紧挨着写两个s是否正确?(像这样col col
Shafizadeh

4
@Shafizadeh是的。这提供了重命名列的可能性。第一个是原始名称,第二个是新名称。
fancyPants

3
如果仅需要更改DEFAULT值,则不要使用此选项。这将完全不处理表的所有行(在大型表上非常长)。改为使用ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>即时的。
尔门

113

作为后续,如果您只想设置默认值,请确保可以使用ALTER .. SET语法。只是不要把所有其他东西放在那里。如果要放入其余的列定义,请根据接受的答案使用MODIFY或CHANGE语法。

无论如何,用于设置列默认值的ALTER语法(因为这是我来这里时一直在寻找的内容):

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

对于哪个“文字”也可以是数字(例如...SET DEFAULT 0)。我没有尝试过,...SET DEFAULT CURRENT_TIMESTAMP但是为什么不呢?


5
如果引用的话,current_timestamp也不适合我。我必须使用以下内容:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1对我来说是最佳答案,因为这样一来,我无需指定列的类型和其他不会改变的东西!
user2342558

2
这是仅更改DEFAULT值的有效答案。
尔门

1
如果您希望默认值为插入时间,请使用NOW()current_timestamp()@Malaise @Nereis
BlueCacti

16

如果要为已创建的列添加默认值,这对我有用:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
这是最佳答案,因为您无需复制现有的字段规范。
rjh

4

对于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;

请注意列名声明

删除DEFAULT CURRENT_TIMESTAMP:

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

为什么要使用双列名称?
MKJ

2
ALTER TABLE表名CHANGE COLUMN oldColName newColName columnDefinitions
伦纳德·勒帕达图

1

接受答案效果很好。

如果无效使用NULL值错误,请对NULL值将该列中的所有空值更新为默认值,然后尝试进行更改。

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

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

我需要什么。谢谢
Arrslion

0

如果上述方法对您不起作用(例如,您正在使用新的SQL或Azure),请尝试以下操作:

1)删除现有的列约束(如果有):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2)创建一个新的:

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

0

试试这个

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

像这样

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.