2013-04-09 66 views
7

爲什麼第一個INSERT要經過table2。請注意,table2.col_1不是NULL。它不會爲col_1插入NULL,但會神奇地將NULL值轉換爲空字符串。我正在使用MySQL版本5.5.28。謝謝MySQL在NOT NULL列中插入帶有NULL值的記錄

mysql> DROP TABLE IF EXISTS table1, table2; 

Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE IF NOT EXISTS table1 (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    -> col_1 VARCHAR(45) NOT NULL , 
    -> col_2 VARCHAR(45) NOT NULL , 
    -> PRIMARY KEY (`id`)) 
    -> ENGINE = InnoDB; 

Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE table2 LIKE table1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO table1 (id, col_1, col_2) VALUES (NULL, "xxx","yyy"); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO table2 (id, col_1, col_2) SELECT NULL, NULL, col_2 FROM table1 WHERE id=1; 
Query OK, 1 row affected, 1 warning (0.00 sec) 
Records: 1 Duplicates: 0 Warnings: 1 

mysql> SHOW WARNINGS; 
+---------+------+-------------------------------+ 
| Level | Code | Message      | 
+---------+------+-------------------------------+ 
| Warning | 1048 | Column 'col_1' cannot be null | 
+---------+------+-------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM table2; 
+----+-------+-------+ 
| id | col_1 | col_2 | 
+----+-------+-------+ 
| 1 |  | yyy | 
+----+-------+-------+ 
1 row in set (0.00 sec) 

mysql> INSERT INTO table2 (id, col_1, col_2) VALUES(NULL, NULL, "zzz"); 
ERROR 1048 (23000): Column 'col_1' cannot be null 

mysql> SELECT * FROM table2; 
+----+-------+-------+ 
| id | col_1 | col_2 | 
+----+-------+-------+ 
| 1 |  | yyy | 
+----+-------+-------+ 
1 row in set (0.00 sec) 
+0

也許它插入'NULL'字符串,而不是空(*不*) – 2013-04-09 15:00:08

+0

奇怪了,我做的是相同的,我得到了插入空...也許你可以在綁定值時指定PDO :: PARAM_INT? – Sebas 2013-04-09 15:05:58

+0

@JW請解釋一下。我只是編輯了原始帖子,以顯示如果插入由SELECT提供,它只插入一行。 – user1032531 2013-04-09 15:06:02

回答

7

您有MySQL的STRICT模式關閉。 打開它,你會得到一個錯誤。

否則,你可以測試與PDO通過這些警告:http://php.net/manual/en/pdo.errorinfo.php

+0

謝謝大衛,我的壞,原來與PDO或PHP無關。我編輯了原帖以顯示此內容。對困惑感到抱歉。 – user1032531 2013-04-09 15:23:10

+0

@ user1032531更新了此答案,以反映我的進一步理解。 – DavidScherer 2013-04-09 15:24:54

+0

我敢打賭你是對的!我從來不知道MySQL STRICT模式,並會對其進行測試。謝謝 – user1032531 2013-04-09 15:26:04

4

這種行爲是在MySQL的文檔有據可查。 MySQL doc

如果您沒有使用嚴格模式,那麼無論何時向列中插入「不正確」值,such as a NULL into a NOT NULL column或數值太大的數值到數值列中,MySQL都會將該列設置爲「最佳可能值」而不是產生一個錯誤:,但警告計數遞增

0

我已經嘗試設置MySQL的STRICT模式關閉,並沒有爲我工作(我甚至改變它爲「my.ini」)。

什麼工作對我來說是一個BEFORE INSERT TRIGGER

基本上你:

CREATE TRIGGER triggerName BEFORE INSERT ON customer 
FOR EACH ROW 
BEGIN 
    if new.`customerName` = '' then 
    signal sqlstate '45000' 
    SET MESSAGE_TEXT = 'Customer Name Cannot be Empty!'; 
    end if; 
END 

MESSAGE_TEXT你可以添加你想要的錯誤顯示任何文本。

希望它有幫助!

它的大部分發現here