我正在尝试删除时间戳列的默认值。
我的DDL看起来是这样的:
CREATE TABLE bills
(
...
created_at TIMESTAMP DEFAULT '1971-01-06 00:00:00',
updated_at TIMESTAMP DEFAULT '1970-01-01 00:00:01',
);当我尝试下列任何一项时:
ALTER TABLE bills ALTER COLUMN created_at DROP DEFAULT;
ALTER TABLE bills ALTER COLUMN created_at SET DEFAULT NULL;
ALTER TABLE bills MODIFY COLUMN created_at TIMESTAMP NULL;
ALTER TABLE bills MODIFY COLUMN created_at TIMESTAMP NULL DEFAULT NULL;
ALTER TABLE bills CHANGE COLUMN created_at created_at TIMESTAMP NULL;
ALTER TABLE bills CHANGE COLUMN created_at created_at TIMESTAMP NULL DEFAULT NULL;MYSQL表示它已正确执行。
但是,当我再次检查DDL时,很明显没有什么改变。
另一方面,我可以将默认值更改为指定的值,如下所示:
ALTER TABLE bills ALTER COLUMN created_at SET DEFAULT '1972-02-02 00:00:00';它的更新是正确的。
注意,这些列是可空的(正如您可以从DDL中看到的那样),并且我已经在"create_at“列中放置了空数据值。
我使用的MYSQL版本为v5.7.12
下面是关于我正在使用的版本的更多细节:
$ mysql --version
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper发布于 2018-03-19 19:06:11
使用ALTER语法的更改列或修改列版本。这些要求您指定要从旧定义转到新定义的列的所有属性(更改还需要名称,以便可以同时重命名)。
例如:
ALTER TABLE bills CHANGE COLUMN created_at created_at TIMESTAMP NULL;
ALTER TABLE bills MODIFY COLUMN updated_at TIMESTAMP NULL; 这里有一个sqlfiddle,这样你就可以看到它在运行http://sqlfiddle.com/#!9/303110/3
更新
您检查过EXPLICIT_DEFAULTS_FOR_TIMESTAMP变量的值了吗?
在下面的评论之后,通过设置变量EXPLICIT_DEFAULTS_FOR_TIMESTAMP =1,我成功地使这两条语句在MySQL5.7中工作;
恐怕我无法正确解释这个变量的用途,只想说它似乎是为了禁用时间戳字段中的某些“非标准”行为。这是记录在案的这里。
我会引用其中的一点
默认情况下,禁用explicit_defaults_for_timestamp,从而启用非标准行为。
就我个人而言,我认为这是错误的,如果你想沿着这条路走下去,你应该设置变量,允许使用“非标准”行为。我会管那叫窃听器。
在您的情况下,假设这在您的系统上有效,禁用“非标准”行为将允许使用“标准”语法来更改默认的列。
这是我的系统的输出
paul@zoltan:~$ mysql --version
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper
mysql> SET @@SESSION.EXPLICIT_DEFAULTS_FOR_TIMESTAMP = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table bills;
Query OK, 0 rows affected (0.17 sec)
mysql> create table bills (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> created_at TIMESTAMP DEFAULT '1971-01-06 00:00:00',
-> updated_at TIMESTAMP DEFAULT '1970-01-01 01:00:01'
-> );
Query OK, 0 rows affected (0.42 sec)
mysql> alter table bills alter column created_at drop default;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table bills alter column created_at set default null;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table bills alter column updated_at drop default;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table bills alter column updated_at set default null;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table bills\G
*************************** 1. row ***************************
Table: bills
Create Table: CREATE TABLE `bills` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)https://stackoverflow.com/questions/49368920
复制相似问题