错误1067(42000):' created_at'

时间:2016-04-27 06:37:51

标签: mysql

当我试图改变表格时显示错误

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_at和updated_at

这是我的表结构

enter image description here

17 个答案:

答案 0 :(得分:64)

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

show variables like 'sql_mode' ; 

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

您可以通过命令以root身份全局设置sql_mode:

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

答案 1 :(得分:59)

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

SET sql_mode = '';

答案 2 :(得分:19)

尝试并运行以下命令:

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_atupdated_at字段设置默认值。 MySQL不接受您的命令,因为这些列的值不能为空。

希望这有帮助。

答案 3 :(得分:18)

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

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

答案 4 :(得分:4)

在我的情况下,我有一个要导入的文件。 所以我只是添加了SET sql_mode ='';在文件的开头,它的工作原理!

答案 5 :(得分:3)

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

变化:

ADD_EXECUTABLE(sox3 main.cpp literals.cpp) SET(CMAKE_CXX_COMPILER g++-5) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem /home/sehe/custom/boost -std=c++14 -O3 -pthread -march=native -flto)

为:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

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

希望这有助于某人。

答案 6 :(得分:2)

你可以这样做:

 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值存储为Epoch Seconds,所以时间戳值'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 []>

答案 7 :(得分:2)

运行此查询:

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

它对我有用

答案 8 :(得分:1)

如@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


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

答案 9 :(得分:1)

SET GLOBAL sql_mode = '';

解决了我的问题。

答案 10 :(得分:1)

对于Mysql5.7,登录mysql命令行并运行mysql>命令,显示类似'sql_mode'的变量; 它将在sql_mode中显示NO_ZERO_IN_DATE,NO_ZERO_DATE。

enter image description here

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

enter image description here

现在重新启动mysql。可行!

答案 11 :(得分:0)

如果您在Copy database的{​​{1}}期间收到此错误,则可以执行以下操作:

只需选中 phpmyadmin 框。

enter image description here

答案 12 :(得分:0)

对于Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

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

答案 13 :(得分:0)

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

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

    mysql> show variables like 'sql_mode';

    您会看到类似下面的输出

    enter image description here

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

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

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

    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

答案 14 :(得分:0)

最简单的方法是将 current timestamp 添加到 default value

通过 sql = "... DEFAULT CURRENT_TIMESTAMP;" 添加这个

答案 15 :(得分:0)

这个问题的答案太宽泛了。关于这些问题有很多问题,当不同的基于 MySQL 的引擎的不兼容性臭名昭著时更是如此。 对我来说,最好的选择是在使用选项 --opt (mysqldump --opt) 进行备份时了解变量的状态,并将其应用到我们的备份中,如果它没有像往常一样,要么是因为原始备份我没有,或者因为发生在我们身上的那个是不正确的。

如果备份不包含进行时的设置,我们将不得不开始调查,但基本上我们可以这样做。

将设置添加到备份的标题

echo '
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!50606 SET @OLD_INNODB_STATS_AUTO_RECALC=@@INNODB_STATS_AUTO_RECALC */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=OFF */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;' | cat - mybackup.sql > temp && mv temp  mybackup.sql 

添加还原设置结束

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=@OLD_INNODB_STATS_AUTO_RECALC */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;' >> mybackup.sql 

如果您没有这些设置,您可以在原始服务器上使用 --opt 选项进行 mysqldump 备份,以便获取它们。

如果你没有它,你可以一点一点地进行,在开始和退出时设置必要的设置。

答案 16 :(得分:0)

对于那些在使用 Navicat 传输或导入数据时收到此错误的人,在我的情况下,从 MariaDB 到旧版本的 MySQL..

尝试在 Date Transfer > < 下启用“Use DDL from SHOW CREATE TABLE” strong>高级标签

navicat data transfer advanced tab settings