【问题标题】:How to alter a column and change the default value?如何更改列并更改默认值?
【发布时间】:2012-07-03 23:23:36
【问题描述】:

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

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

标签: mysql sql


【解决方案1】:
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 要求的默认字符串。如果在插入行时没有为此列指定值,则该值变为{}
  • 相邻的两个cols 是否正确? (像这样col col
  • @Shafizadeh 是的。这提供了重命名列的可能性。第一个是原始名称,第二个是新名称。
  • 如果您只需要更改 DEFAULT 值,请不要使用此选项。这将处理表的所有行(在巨大的表上很长)。使用即时的ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>
【解决方案2】:

作为后续,如果你只是想设置一个默认值,很确定你可以使用 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 中出现语法错误!有谁知道为什么?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    ALTER TABLE Persons
    ALTER credit SET DEFAULT 0.0;
    

    【讨论】:

    • 这是最好的答案,因为您不需要复制现有的字段规范。
    【解决方案5】:

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

    请注意double列名声明

    删除 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;
    【解决方案6】:

    试试这个

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

    【讨论】:

      【解决方案7】:

      接受的答案效果很好。

      如果出现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 '{}';
      

      【讨论】:

      • 我需要什么。谢谢
      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多