2011-05-31 31 views
4

我已經看過幾次了。我有一臺服務器,允許我插入一些值,而不指定其他值,如下所示:INSERT INTO table SET value_a='a', value_b='b';(value_c是一個沒有設置默認值的字段,但在此處運行良好)。當腳本被移動到一個新的服務器的一些INSERT查詢突破,因爲它需要查詢指定所有非默認值,給我下面的錯誤不指定非默認值中第一次出現:MySQL INSERT無需指定每個非默認字段(#1067 - '表'的默認值無效)

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

爲表格設置默認值可能會破壞其他區域的功能,否則我會這樣做。我很想知道這裏究竟發生了什麼。

+0

是在CREATE TABLE語句中的每個服務器上的一樣嗎? 'show create table tablename' – sreimer 2011-05-31 21:58:32

+0

是的,它們是一樣的。 – 2011-05-31 22:22:53

回答

14

一個服務器正在嚴格模式在默認情況下運行,其他沒有。 如果服務器以嚴格模式運行(或者將其設置爲連接),並且嘗試將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 
+3

這是完美的,謝謝piotrm。在我看到這個之前,我的解決方案是將所有適當的字段設置爲NULL。對於任何想了解更多嚴格模式的人:http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode。HTML#sqlmode_strict_trans_tables – 2011-06-01 04:24:19

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) 

所以,你要插入沒有廣告的not null列中的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

參見: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

+0

這也是一個可靠的解決方案,但我接受了piotrm的,因爲他對它的原因有了更具體的解釋。 – 2011-06-01 04:30:51