MYSQL不会删除时间戳的默认值

时间:2018-03-19 17:24:52

标签: mysql mysql-5.7

我正在尝试删除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

1 个答案:

答案 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)