ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

我认为您在 DEFAULT 之前不需要 SET

f
fancyPants
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 '{}';

column 是可选的。您可以只使用 ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';,结果将是相同的。
这是 OP 要求的默认字符串。如果在插入行时未为此列指定值,则该值变为 {}
两个col并排写正确吗? (像这个 col col
@Shafizadeh 是的,是的。这提供了重命名列的可能性。第一个是原始名称,第二个是新名称。
如果您只需要更改 DEFAULT 值,请不要使用它。这将处理表的所有行(在大表上很长)。使用即时的 ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>
D
DaveJenni

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

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

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

其中'literal' 也可以是一个数字(例如...SET DEFAULT 0)。我没有用 ...SET DEFAULT CURRENT_TIMESTAMP 尝试过,但为什么不呢?


如果引用, current_timestamp 也对我不起作用。我必须使用以下内容:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
+1 对我来说最好的答案,因为这样我不需要指定列的类型和其他不会改变的东西!
这是仅更改 DEFAULT 值的有效答案。
如果您希望默认值是插入时间,请使用 NOW()current_timestamp() @Malaise @Nereis
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT NOW(); 在 mysql 8.0.25 中出现语法错误!有谁知道为什么?
V
Vim Diesel

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

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0;

这是最好的答案,因为您不需要复制现有的字段规范。
L
Leonard Lepadatu

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

为什么要使用双列名?
ALTER TABLE 表名 CHANGE COLUMN oldColName newColName columnDefinitions
删除默认值??该语法完全错误,您甚至在将其发布到此处之前对其进行了测试吗?
@LeonardLepadatu double column_name 可以通过使用 modify 来避免。 ALTER TABLE tablename MODIFY COLUMN columnname1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
M
Milan

如果上述方法对您不起作用(即:您正在使用新的 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;

P
Pradeep Kumar

接受的答案效果很好。

如果出现 Invalid use of NULL value 错误,则在 NULL 值上,将所有空值更新为该列中的默认值,然后尝试进行更改。

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

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

我需要什么。谢谢
S
Sohail Ahmad

尝试这个

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 '';

V
Vasu Gupta

使用这种方法: -

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


正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center