错误1067(42000):“ created_at”的默认值无效


100

当我尝试更改表时,显示错误:

ERROR 1067 (42000): Invalid default value for 'created_at'

我用谷歌搜索了这个错误,但是我发现的一切就像他们试图更改时间戳一样。但是在这里,我试图添加一个新列,并且出现此错误:

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

我表的最后两列是created_atupdated_at

这是我的表结构:

在此处输入图片说明


这些列的默认值是多少?你能分享表结构吗?
Priyanshu

@Priyanshu我已经更新了我的表结构
iamsujit

2
为最后两列设置默认值current_timestamp。
Priyanshu

Answers:


144

问题是由于sql_modes。请通过命令检查当前的sql_modes:

show variables like 'sql_mode' ; 

并删除sql_mode“ NO_ZERO_IN_DATE,NO_ZERO_DATE ”以使其工作。这是mysql新版本中的默认sql_mode。

您可以通过以下命令将sql_mode全局设置为root:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
我知道这一点,但是在我的服务器sql_mode中显示为空白,仍然无法正常工作,我正在使用[服务器版本:5.5.53-0ubuntu0.12.04.1-(Ubuntu)]。任何人都可以在不升级服务器版本的情况下有任何解决方案吗?
Priyabrata Atha

您是否已通过全局命令检查过?并且在sql_mode中没有用于同一会话的内容吗?
阿曼·阿格瓦尔

我检查了像'sql_mode'这样的show变量;并且输出为Variable_name | Value = sql_mode |
Priyabrata Atha


4
不适用于5.7。不知道我是否必须在全球范围内这样做。
Brett

95

简单来说,在运行任何语句之前,请将其放在第一行:

SET sql_mode = '';

那太棒了。谢谢老兄!
Novasol

7
谢谢你的提示。但是仅删除日期限制NO_ZERO_IN_DATE,NO_ZERO_DATE仅允许我们维护其他安全功能:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG

1
为了澄清起见,此声明仅应在开发中使用,而不能在生产中使用。
艾哈迈德·穆罕默德

28

尝试安装第三方数据库时遇到了相同的错误。我尝试了未成功提出的解决方案,即
SET sql_mode = '';

然后我尝试了下面的命令,该命令可以允许安装数据库
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';现在已弃用,SET GLOBAL sql_mode = ''可以

25

尝试并运行以下命令:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

出现此错误的原因是,您没有为created_at和设置默认值updated_at字段。MySQL不接受您的命令,因为这些列的值不能为null。

希望这可以帮助。


2
谢谢您,我很喜欢我的用例中的这种解决方案
ChrisR

5

就我而言,我有一个要导入的文件。所以我只是添加了SET sql_mode =''; 在文件的开头,它可以工作!


5

运行此查询:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

这个对我有用


顺便说一下,不需要SET time_zone =“ +00:00”;
Safak Ciplak

3

您可以这样做:

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 由于TIMESTAMP值存储为大纪元,因此时间戳值'1970-01-01 00:00:00'(UTC)被保留,因为第二个#0用于表示'0000-00-00 00:00:00 '。
  • 在MariaDB 5.5及更低版本中,每个表只能有一个TIMESTAMP列,其CURRENT_TIMESTAMP定义为其默认值。自MariaDB 10.0起,该限制不再适用。

参见:https : //mariadb.com/kb/en/mariadb/timestamp/

样品

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>

3

我有类似的问题。以下解决了它:

更改:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

至:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

即只是删除CURRENT_TIMESTAMP周围的引号。

希望这对某人有帮助。


3

如@Bernd Buffen的答案中所述。这是MariaDB 5.5的问题,我简单地将MariaDB 5.5升级到MariaDB 10.1,问题已解决。

这是在CentOS 7 (64位)上将MariaDB 5.5升级到MariaDB 10.1的步骤

  1. 将以下行添加到MariaDB存储库。

    nano /etc/yum.repos.d/mariadb.repo 并粘贴以下几行。

[mariadb]
名称= MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. 停止MariaDB(如果已运行) service mariadb stop
  2. 执行更新

    yum update

  3. 启动MariaDB并执行升级

    service mariadb start

    mysql_upgrade

一切都完成了。

检查MariaDB版本: mysql -V


注意:在执行升级之前,请始终备份数据库。如果升级失败或出现问题,数据可能会丢失。




1

对于Mysql5.7,请在mysql命令行中登录并运行以下命令:mysql> show variables like'sql_mode'; 它将在sql_mode中显示NO_ZERO_IN_DATE,NO_ZERO_DATE。

在此处输入图片说明

尝试在mysql conf文件中的[mysqld]下面添加一行以删除两个选项,我的(Ubuntu 16上的mysql 5.7)是/etc/mysql/mysql.conf.d/mysqld.cnf

在此处输入图片说明

现在重启mysql。有用!


0

对于Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

删除“([[fsp])”,解决了我的问题。


0
  1. 首先,在终端中使用以下命令检查现有模式:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    要么

    mysql> show variables like 'sql_mode';

    您将看到类似以下的输出

    在此处输入图片说明

  2. 通过my.cnf禁用模式:在这种情况下,您需要删除NO_ZERO_IN_DATE和NO_ZERO_DATE模式

    打开my.cnf文件(通常可以在/etc/my.cnf或/etc/mysql/my.cnf中找到my.cnf文件)

    [mysqld]标题下的my.cnf中更新模式

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    在这里,我省略了NO_ZERO_IN_DATE,NO_ZERO_DATE模式

  3. 重启mysql服务器

    $ /etc/init.d/mysql restart

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.