11

为什么 table2 的第一个 INSERT 会通过。请注意 table2.col_1 不是 NULL。它不会为 col_1 插入 NULL,而是将 NULL 值神秘地转换为空字符串。我正在使用 MySQL 版本 5.5.28。谢谢

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)
4

3 回答 3

12

您已关闭 MySQL 的 STRICT 模式。打开它,你会得到一个错误。

否则,您可以通过以下方式使用 PDO 测试这些警告:http: //php.net/manual/en/pdo.errorinfo.php

于 2013-04-09T15:15:55.570 回答
8

这种行为在 MySQL 文档中有很好的记录。MySQL 文档

如果您没有使用严格模式,那么每当您将“不正确”的值插入到列中,such as a NULL into a NOT NULL column或者将过大的数值插入到数值列中时,MySQL 都会将该列设置为“最佳可能值”而不是产生错误: ,但警告计数增加

于 2013-04-09T15:42:44.757 回答
-1

我尝试将 MySQL 的 STRICT 模式设置为 OFF,但对我不起作用(我什至将其更改为 "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添加您希望错误显示的任何文本。

希望能帮助到你!

大部分都在这里找到

于 2018-02-18T17:46:59.377 回答