【发布时间】:2021-02-21 15:56:57
【问题描述】:
在创建表格时,我忘记添加出生日期列。有没有办法将 NOT NULL 列添加到默认值为当前日期的表中?
【问题讨论】:
标签: mysql sql alter-table date-arithmetic sql-null
在创建表格时,我忘记添加出生日期列。有没有办法将 NOT NULL 列添加到默认值为当前日期的表中?
【问题讨论】:
标签: mysql sql alter-table date-arithmetic sql-null
您可以使用alter table。在 MySQL 8.0 中:
alter table mytable
add datetime_of_birth datetime
not null
default (current_date);
但是,在早期版本中,您不能拥有默认值为 current_date 的 date 列。仅datetimes 和timestamps 列支持此功能。如果您可以接受datetime 列,那么:
alter table mytable
add datetime_of_birth datetime
not null
default current_timestamp;
然后,您可以在查询时忽略该列的时间部分。如果这不是一个可接受的解决方案,那么您需要使用触发器来实现逻辑。
【讨论】:
如果您的表中有数据行,则必须将该列添加为可为空,或者为其指定一个 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。
【讨论】:
使用alter table:
alter table t add column date_of_birth date;
【讨论】: