Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 错误1067(42000):无效的默认值为';创建于';_Mysql - Fatal编程技术网

Mysql 错误1067(42000):无效的默认值为';创建于';

Mysql 错误1067(42000):无效的默认值为';创建于';,mysql,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' 我

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

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'
我的表格的最后两列是在处创建的
和在
处更新的

以下是我的表格结构:


尝试运行以下命令:

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


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

您可以这样做:

 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;
  • 由于时间戳值存储为历元秒,因此保留时间戳值“1970-01-01 00:00:00”(UTC),因为第二个#0用于表示“0000-00-00:00:00”
  • 在MariaDB 5.5及之前版本中,每个表只能有一个时间戳列,该列的当前时间戳定义为其默认值。自MariaDB 10.0以来,该限制不再适用
见:

样本

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\u模式。 请通过命令检查您当前的sql\u模式:

show variables like 'sql_mode' ; 
并删除sql模式“无零日期、无零日期”以使其正常工作。 这是mysql新版本中的默认sql_模式

您可以通过以下命令将sql_模式全局设置为root用户:

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

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

SET sql_mode = '';

请注意:此语句应仅用于开发,而不用于生产。

我也有类似的问题。以下几点解决了这个问题:

更改:

reclect\u日期时间戳默认值'CURRENT\u TIMESTAMP',

致:

reclect\u日期时间戳默认当前时间戳,

i、 e.只需删除当前时间戳周围的引号即可


希望这对某人有所帮助。

在我的情况下,我有一个文件要导入。

所以我简单地添加了
setsql\u mode=''在文件的开头,它可以工作

我在尝试安装第三方数据库时遇到了相同的错误。 我尝试了提出的解决方案,但没有成功,即
SET sql\u mode=''

然后我尝试了下面的命令,该命令允许安装数据库
设置全局sql\u模式=“”

运行此查询:

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的步骤

  • 将以下行添加到MariaDB回购

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

  • [mariadb]
    name=MariaDB
    baseurl=
    gpgkey=
    gpgcheck=1

  • 如果已在运行,请停止MariaDB
    服务停止
  • 执行更新

    yum更新

  • 启动并执行升级

    服务启动

    mysql\u升级

  • 一切都完成了

    检查MariaDB版本:
    mysql-V


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

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

    mysql> show variables like 'sql_mode' ;
    
    它将显示在日期中没有日期,在sql模式中没有日期

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


    现在重新启动mysql。它起作用了

    只需通过以下行进行转换:

    对于新表格:

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

    对于现有表格:

    Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    

    资料来源:

    对于Mysql8.0.18:

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

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

    $mysql-u root-p-e“显示类似'sql_mode'的变量”;”

    mysql>显示“sql_模式”等变量

    您将看到如下输出

  • 通过my.cnf禁用模式: 在这种情况下,您需要删除无日期、无日期模式中的无日期

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

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

    sql\u mode=ONLY\u FULL\u GROUP\u BY、STRICT\u TRANS\u TABLES、ERROR\u FOR\u DIVISION\u BY\u ZERO、NO\u AUTO\u CREATE\u USER、NO\u ENGINE\u SUBSTITUTION

    在这里,我省略了无日期、无日期模式中的无日期

  • 重新启动mysql服务器

    $/etc/init.d/mysql重启


  • 最简单的方法是将
    当前时间戳
    添加到
    默认值


    通过添加sql=
    “…默认当前时间戳;”

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

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

    将设置添加到备份的标头 将还原设置添加到结束 如果没有这些设置,可以在原始服务器上使用--opt选项进行mysqldump备份,以获取这些设置

    如果你没有它,你可以一点一点地走,赛特
    CURRENT_TIMESTAMP([fsp])
    
    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