2013-04-09 44 views
7

Tại sao INSERT đầu tiên đi qua cho bảng 2. Lưu ý rằng table2.col_1 là NOT NULL. Nó không chèn NULL cho col_1, nhưng bí ẩn chuyển đổi giá trị NULL thành một chuỗi rỗng. Tôi đang sử dụng MySQL phiên bản 5.5.28. Cảm ơnGhi chèn MySQL với giá trị NULL trong cột 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

có lẽ nó chèn 'chuỗi NULL' và không phải là null (* gì *) –

+0

Strange, tôi đang làm cùng và tôi làm được nulls chèn ... Có lẽ bạn có thể chỉ định PDO :: PARAM_INT khi bạn liên kết giá trị? – Sebas

+0

@JW Vui lòng giải thích. Tôi chỉ cần chỉnh sửa bài viết gốc để hiển thị như thế nào nó chỉ chèn một hàng nếu INSERT được cung cấp bởi một SELECT. – user1032531

Trả lời

7

Bạn đã tắt chế độ STRICT của MySQL. Bật tính năng này và bạn sẽ gặp lỗi.

Nếu không, bạn có thể kiểm tra đối với những cảnh báo với PDO qua: http://php.net/manual/en/pdo.errorinfo.php

+0

Cảm ơn David, xấu của tôi, hóa ra không liên quan gì đến PDO hay PHP. Tôi đã chỉnh sửa bài đăng gốc để hiển thị bài đăng này. Xin lỗi vì sự nhầm lẫn. – user1032531

+0

@ user1032531 Đã cập nhật câu trả lời này để phản ánh khả năng hiểu sâu hơn của tôi. – DavidScherer

+0

Tôi cá là bạn đã đúng! Tôi chưa bao giờ biết về chế độ STRICT của MySQL và sẽ thử nghiệm nó. Cảm ơn – user1032531

4

Hành vi này cũng được ghi lại trong tài liệu MySQL. MySQL doc

Nếu bạn không sử dụng chế độ nghiêm ngặt, thì bất cứ khi nào bạn chèn giá trị "không đúng" vào cột, such as a NULL into a NOT NULL column hoặc giá trị số quá lớn vào cột số, MySQL đặt cột thành "giá trị tốt nhất có thể" thay vì tạo lỗi: nhưng số lượng cảnh báo được tăng lên

0

Tôi đã thử đặt chế độ STRICT của MySQL là OFF và không hoạt động đối với tôi (tôi thậm chí đã thay đổi thành "my.ini").

gì làm việc cho tôi là một BEFORE INSERT TRIGGER

Về cơ bản bạn cần làm:

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 

Trong MESSAGE_TEXT bạn có thể thêm bất cứ điều gì bạn muốn văn bản lỗi hiển thị.

Hy vọng điều đó sẽ hữu ích!

Hầu hết nó tìm thấy here

Các vấn đề liên quan