【问题标题】:Alter table and set default as current date更改表并将默认设置为当前日期
【发布时间】:2021-02-21 15:56:57
【问题描述】:

在创建表格时,我忘记添加出生日期列。有没有办法将 NOT NULL 列添加到默认值为当前日期的表中?

【问题讨论】:

    标签: mysql sql alter-table date-arithmetic sql-null


    【解决方案1】:

    您可以使用alter table。在 MySQL 8.0 中:

    alter table mytable 
        add datetime_of_birth datetime 
        not null
        default (current_date);
    

    但是,在早期版本中,您不能拥有默认值为 current_datedate 列。仅datetimes 和timestamps 列支持此功能。如果您可以接受datetime 列,那么:

    alter table mytable 
        add datetime_of_birth datetime 
        not null
        default current_timestamp;
    

    然后,您可以在查询时忽略该列的时间部分。如果这不是一个可接受的解决方案,那么您需要使用触发器来实现逻辑。

    【讨论】:

      【解决方案2】:

      如果您的表中有数据行,则必须将该列添加为可为空,或者为其指定一个 DEFAULT,该默认值将分配给每一行。

      如果您不提供 DEFAULT,则 NOT NULL 列将尝试添加“默认默认值”。日期的默认值为'0000-00-00',这是一个无效日期,如果您设置了严格模式(我推荐),它将被拒绝:

      mysql> create table mytable (id int primary key );
      Query OK, 0 rows affected (0.02 sec)
      
      mysql> insert into mytable values (1);
      Query OK, 1 row affected (0.01 sec)
      
      mysql> alter table mytable add column date_of_birth date not null;
      ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'date_of_birth' at row 1
      

      DATETIME 或 TIMESTAMP 数据类型可以默认为 CURRENT_TIMESTAMP:

      mysql> alter table mytable add column date_of_birth datetime not null default current_timestamp;
      Query OK, 0 rows affected (0.13 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      

      但你说你想要一个 DATE 列,但不允许这样做:

      mysql> alter table mytable add column date_of_birth date not null default current_timestamp;
      ERROR 1067 (42000): Invalid default value for 'date_of_birth'
      

      在 MySQL 8.0 中,您可以使用表达式作为默认值(注意表达式周围的额外括号,这是必需的):

      mysql> alter table mytable add column date_of_birth date not null default (curdate());
      Query OK, 1 row affected (0.04 sec)
      Records: 1  Duplicates: 0  Warnings: 0
      

      如果您使用的是早期版本的 MySQL,则无法在一个 ALTER TABLE 中执行此操作。您必须先将该列添加为可为空的列,然后使用 UPDATE 将值回填到所有现有行中,然后再次 ALTER TABLE 将该列修改为 NOT NULL。

      【讨论】:

        【解决方案3】:

        使用alter table:

        alter table t add column date_of_birth date;
        

        【讨论】:

        • 我需要该列没有空值
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2011-04-09
        • 2012-11-20
        相关资源
        最近更新 更多