ERROR 1067(42000) : “ create_at”的默认值无效

当我试图修改表格时,它显示了错误:

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

下面是我的表结构:

enter image description here

282026 次浏览

尝试运行以下命令:

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 不接受您的命令,因为这些列的值不能为空。

你可以这样做:

 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 秒,所以时间戳值“1970-01-0100:00:00:00”(UTC)是保留的,因为第二个 # 0用于表示“0000-00-0000: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 []>

问题在于 Sql _ mode。 请通过命令检查当前的 sql _ mode:

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';

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

SET sql_mode = '';

请注意: 此声明仅应用于开发,不应用于生产。

我也遇到过类似的问题:

改变:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

致:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

也就是说,只需删除 < em > CURRENT _ TIMESTAMP 周围的引号。

希望这对谁有帮助。

对于我来说,我需要导入一个文件。
因此,我只是添加了 SET sql_mode = '';在文件的开头,它的工作!

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

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

运行以下查询:

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

对我有用

正如@Bernd Buffen 在回答中提到的。这是 MariaDB 5.5的问题,我简单地将 MariaDB 5.5升级到 MariaDB 10.1,问题就解决了。

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

  1. 将以下代码行添加到 MariaDB repo。

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

[ Mariadb ]
Name = MariaDB
Baseurl = < a href = “ http://yum.mariadb.org/10.1/centos7-amd64”rel = “ nofollow norefrer”> http://yum.mariadb.org/10.1/centos7-amd64
Gpgkey = < a href = “ https://yum.mariadb.org/RPM-gPG-KEY-MariaDB”rel = “ nofollow norefrer”> https://yum.mariadb.org/rpm-gpg-key-mariadb
Gpgcheck = 1 < br >

  1. 停止 MariaDB,如果已经在运行 service mariadb stop
  2. 执行更新

    yum update

  3. 启动 MariaDB 并进行升级

    service mariadb start

    mysql_upgrade

一切都结束了。

检查 MariaDB 版本: mysql -V


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

对于 Mysql5.7,登录 mysql 命令行并运行命令,

mysql> show variables like '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.con.d/mysqld.cnf

enter image description here

现在重新启动 mysql。它工作了!

只要把它转换成这行:

新桌子:

CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

现有表格:

Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

来源:

Https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html

18:

CURRENT_TIMESTAMP([fsp])

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

  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 文件)

    [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

最简单的方法是将 current timestamp加入到 default value中。

或者

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

这个问题太宽泛,无法回答。关于这些问题有很多问题,当基于 MySQL 的不同引擎的不兼容性是众所周知的时候更是如此。 对我来说,最好的选择是知道备份时变量的状态—— opt (mysqldump —— opt) ,如果备份没有像往常一样,应用到我们的备份,或者是因为原始备份我没有备份,或者是因为发生在我们身上的备份是不正确的。

如果备份没有包含制作它的设置,我们将不得不开始调查,但基本上我们可以这样做。

将 SETtings 添加到备份标题

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 备份,以获取这些设置。

如果你没有,你可以一点一点地去,设置必要的设置,无论是在开始和退出。

对于那些在使用 Navicat 传输或导入数据时收到此错误的用户,在我的例子中是从 MariaDB 到旧版本的 MySQL。.

尝试在 < strong > 日期转移 > < strong > Advanced Tab 下启用“ < strong > 使用 SHOW CREATE TABLE 中的 DDL

Navicat 数据传输高级选项卡设置

我遇到了类似的挑战与 服务器版本: 8.0.27-0ubuntu0.20.04.1(Ubuntu)和解决使用以下技巧

  1. 连接到 MySQL 服务器 mysql -u root -p
  2. 使用“ query”显示 sql _ mode 变量: show variables like 'sql_mode';
  3. 复制字符串输出之后
  4. 编辑 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf处的配置文件
  5. 如果您的配置文件缺少 Sql _ mode = sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION从字符串中省略 NO _ ZERO _ IN _ DATE,NO _ ZERO _ DATE。
  6. 运行 Sudo service mysql restart应用更改。

我在使用 phpMyAdmin (5.2.0)时遇到了这个错误,因为我想将这两个列(create _ at 和 update _ at)添加到一个现有的表中,我解决这个问题的方法只是 在这些列上放置非空