2013-11-21 68 views
0

我正在使用MySQL(Percona 5.5.34-32.0),我有這張表;AUTO_INCREMENT在插入時需要一個值,但有時只有

mysql> SHOW CREATE TABLE privmsgs\G 
*************************** 1. row *************************** 
     Table: privmsgs 
Create Table: CREATE TABLE `privmsgs` (
    `msg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `root_level` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `author_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `icon_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `author_ip` varchar(40) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `message_time` int(11) unsigned NOT NULL DEFAULT '0', 
    `enable_bbcode` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `enable_smilies` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `enable_magic_url` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `enable_sig` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `message_subject` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `message_text` mediumtext COLLATE utf8_bin NOT NULL, 
    `message_edit_reason` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `message_edit_user` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `message_attachment` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `bbcode_bitfield` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `bbcode_uid` varchar(8) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `message_edit_time` int(11) unsigned NOT NULL DEFAULT '0', 
    `message_edit_count` smallint(4) unsigned NOT NULL DEFAULT '0', 
    `to_address` text COLLATE utf8_bin NOT NULL, 
    `bcc_address` text COLLATE utf8_bin NOT NULL, 
    PRIMARY KEY (`msg_id`), 
    KEY `author_ip` (`author_ip`), 
    KEY `message_time` (`message_time`), 
    KEY `author_id` (`author_id`), 
    KEY `root_level` (`root_level`) 
) ENGINE=InnoDB AUTO_INCREMENT=5238652 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPACT 

我有這樣的模式對整個會話啓用:

mysql> SELECT @@session.sql_mode\G 
*************************** 1. row *************************** 
@@session.sql_mode: ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO, 
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE, 
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

當我嘗試插入一些東西,出現這種情況:

mysql> INSERT INTO privmsgs 
    -> (root_level, author_id, icon_id, author_ip, message_time, 
    -> enable_bbcode, enable_smilies, enable_magic_url, enable_sig, 
    -> message_subject, message_text, message_attachment, bbcode_bitfield, 
    -> bbcode_uid, to_address, bcc_address) 
    -> VALUES 
    -> (0, 12345, 0, '127.0.0.0', 123456789, 1, 1, 0, 0, 'test', 
    -> 'testing message', 0, '', 'xxx', 'u_12345', ''); 
ERROR 1364 (HY000): Field 'msg_id' doesn't have a default value 

最奇怪的是,如果我創建另一個運行與我之前粘貼的SHOW CREATE TABLE privmsgs完全相同的輸出(但顯然將其名稱更改爲其他內容,例如privmsgs2),我可以運行沒有任何錯誤或警告完全相同的查詢:

mysql> INSERT INTO privmsgs2 
    -> (root_level, author_id, icon_id, author_ip, message_time, 
    -> enable_bbcode, enable_smilies, enable_magic_url, enable_sig, 
    -> message_subject, message_text, message_attachment, bbcode_bitfield, 
    -> bbcode_uid, to_address, bcc_address) 
    -> VALUES 
    -> (0, 12345, 0, '127.0.0.0', 123456789, 1, 1, 0, 0, 'test', 
    -> 'testing message', 0, '', 'xxx', 'u_12345', ''); 
Query OK, 1 row affected (0.00 sec) 

這是怎麼回事?

請注意,禁用STRICT_*模式是不是我要找的解決方案:它不乾淨,而且我可以在同一會話表明運行在另一個相同表完全相同的查詢的事實(?)問題可能不在那裏。

+1

這是因爲你處於STRICT模式。只需在您的INSERT中添加msg_id和NULL即可。因此,這是一個...[SQL語句中使用INSERT和AUTO-INCREMENT列的錯誤]的可能重複(http://stackoverflow.com/questions/7899676/error-in-sql-statement-using-insert-and-auto-increment-column) – Strawberry

+0

請閱讀完整的問題:我知道禁用STRICT模式可以解決這個問題。但爲什麼它在桌子上而不是在其他桌子上? –

+0

我認爲@strawberry給了你答案,INSERT不能猜測你的msg_id是未定義的,你需要直到它。這是AUTO_INCREMENT的工作原理,您提供NULL作爲自動增量字段的值。在某些情況下,MySQL足夠聰明地猜測它。 – nrathaus

回答

0

好的,這是事實:

  • 這是一個phpBB的安裝,其已經可以正常使用了很長時間與MySQL的Percona的表。
  • 連接時,默認情況下,應用程序設置STRICT_ALL_TABLESSTRICT_TRANS_TABLES模式,並且一直這樣做了很長一段時間。
  • 在應用程序使用的所有表格中,這是唯一一個描述的不一致行爲出現的地方
  • 當創建另一個表粘貼SHOW CREATE TABLE privmsgs輸出時,新表沒有顯示這種行爲。當使用CREATE TABLE privmsgs2 FROM privmsgs,時,它確實是
  • 降級到Oracle的MySQL 5.5.31並沒有改變任何這些事實。

我試着重建與ALTER TABLE privmsgs ENGINE=InnoDBaccording official documentation表,但沒有幫助。

所以我甩表mysqldump databasename privmsgs > table.sql,與sed文件中更名爲privmsgs2,然後用mysql databasename < table.sql重新導入它。然後,我放棄privmsgs並將其更名爲privmsgs2privmsgs

然後它開始再次完美地工作。我不明白爲什麼,也找不到這種行爲的任何其他參考。如果有人能用比我更精確的答案解釋它,請做,我會接受你的答案。

相關問題