4

我已经看过好几次了。我有一台服务器允许我插入一些值,而无需像这样指定其他值:INSERT INTO table SET value_a='a', value_b='b';(value_c 是一个没有设置默认值的字段,但在这里可以正常工作)。当脚本移动到新服务器时,一些 INSERT 查询中断,因为它要求查询指定所有非默认值,第一次出现未指定非默认值时出现以下错误:

#1364 - Field 'value_c' doesn't have a default value

为表设置默认值可能会破坏其他区域的功能,否则我会这样做。我很想知道这里到底发生了什么。

4

2 回答 2

15

默认情况下,您的一台服务器在严格模式下运行,而另一台则不是。如果服务器以严格模式运行(或者您在连接中设置)并且您尝试将 NULL 值插入定义为 NOT NULL 的列中,您将收到 #1364 错误。如果没有严格模式,您的 NULL 值将被替换为空字符串或 0。

例子:

CREATE TABLE `test_tbl` (
 `id` int(11) NOT NULL,
 `someint` int(11) NOT NULL,
 `sometext` varchar(255) NOT NULL,
 `somedate` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SET sql_mode = '';
INSERT INTO test_tbl(id) VALUES(1);
SELECT * FROM test_tbl;
+----+---------+----------+---------------------+
| id | someint | sometext | somedate            |
+----+---------+----------+---------------------+
|  1 |       0 |          | 0000-00-00 00:00:00 |
+----+---------+----------+---------------------+
SET sql_mode = 'STRICT_ALL_TABLES';
INSERT INTO test_tbl(id) VALUES(2);
#1364 - Field 'someint' doesn't have a default value 
于 2011-05-31T23:29:11.367 回答
1
INSERT INTO table SET value_a='a', value_b='b'

将执行以下查询:

在下表中

TABLE `table`
    a varchar
    b varchar
    c varchar NOT NULL -- column is listed as NOT NULL !

您正在对它进行以下查询

INSERT INTO `table` (a,b,c) VALUES ('a', 'b', null)

因此,您试图在没有列出默认值null的列中插入一个值。not null这就是您收到错误的原因。

但是为什么我在服务器 B 而不是服务器 A 上收到此错误

可能的原因有:

  1. create table 语句不一样:show create table table1在每台服务器上执行 a 并仔细比较输出。
  2. 服务器 A 上存在一个before insert触发器,但服务器 B 上没有(反之亦然),它正在更改您插入的输入。show triggers in databasex在每台服务器上执行并比较输出。
  3. 服务器 A 上的表使用与服务器 B 不同的引擎。这将显示在show create table最后一行的输出中,例如ENGINE=MyISAM

见: http: //dev.mysql.com/doc/refman/5.0/en/show-triggers.html
http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

于 2011-05-31T23:19:55.173 回答