我正在尝试删除timestamp列的默认值。
我的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 shell表示它已正确执行。
然而,当我再次检查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
答案 0 :(得分:0)
使用ALTER TABLE语法的CHANGE COLUMN或MODIFY COLUMN版本。这些要求您指定要从旧定义到新定义的列的所有属性(CHANGE还需要名称,以便您可以同时重命名)。
e.g。
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来使你的两个语句在mysql 5.7中工作;
我担心我无法正确解释这个变量的用途,只是说它似乎是为了禁用某些非标准的变量。 TIMESTAMP字段中的行为。它记录了here。
我引用一点
默认情况下,禁用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)