2013-04-09 17 views
7

Dlaczego pierwszy INSERT przechodzi przez table2. Zauważ, że table2.col_1 NIE ma wartości NULL. Nie wstawia wartości NULL dla col_1, ale w tajemniczy sposób konwertuje wartość NULL na pusty ciąg znaków. Używam MySQL w wersji 5.5.28. DziękiMySQL Wstawia rekord z wartością NULL w kolumnie NOT 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

może to wstawia 'ciąg NULL' a nie wartość null (* nic *) –

+0

Dziwne, ja robię to samo i mam dostać null włożona ... Może mógłbyś podać PDO :: PARAM_INT po związaniu wartości? – Sebas

+0

@JW Proszę wyjaśnić. Właśnie edytowałem oryginalny wpis, aby pokazać, jak wstawia on tylko wiersz, jeśli INSERT jest zasilany przez SELECT. – user1032531

Odpowiedz

7

Masz wyłączony tryb STRICT MySQL. Włącz go, a otrzymasz komunikat o błędzie.

przeciwnym razie można przetestować na tych ostrzeżeń z PDO poprzez: http://php.net/manual/en/pdo.errorinfo.php

+0

Dzięki David, Mój zły, nie ma nic wspólnego z PDO lub PHP. Edytowałem oryginalny wpis, aby to pokazać. Przepraszam za zamieszanie. – user1032531

+0

@ user1032531 Zaktualizowano tę odpowiedź, aby odzwierciedlić moje dalsze zrozumienie. – DavidScherer

+0

Założę się, że masz rację! Nigdy nie wiedziałem o trybie MySQL STRICT i przetestuję go. Dzięki – user1032531

4

Takie zachowanie jest dobrze udokumentowane w docs MySQL. MySQL doc

Jeśli nie używasz trybu ścisłego, to za każdym razem, gdy wstawisz "niepoprawną" wartość do kolumny, such as a NULL into a NOT NULL column lub zbyt dużą wartość liczbową w kolumnie liczbowej, MySQL ustawi kolumnę na "najlepszą możliwą wartość" zamiast generowania błędu:, ale liczba ostrzeżeń jest zwiększana

0

Próbowałem ustawić WYŁĄCZENIE trybu MySQL OFF i nie działało dla mnie (nawet zmieniłem go na "my.ini").

Co pracował dla mnie było BEFORE INSERT TRIGGER

Zasadniczo zrobić:

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 

W MESSAGE_TEXT można dodać cokolwiek chcesz tekst błędu pokazać.

Mam nadzieję, że pomoże!

Większość z nich znaleziono here

Powiązane problemy