MySQL INSERT,无需指定每个非默认字段(#1067 - 'table'的默认值无效)

时间:2011-05-31 21:56:10

标签: mysql insert mysql-error-1364

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

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

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

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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并仔细比较输出。
  2. 服务器A上存在before insert触发器但服务器B上没有(或反之亦然),这会更改您正在插入的输入。在每台服务器上执行show triggers in databasex并比较输出。
  3. 服务器A上的表使用与服务器B不同的引擎。这将在show create table的输出中显示为最后一行,例如ENGINE=MyISAM
  4. 请参阅: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