我已经在我的表中定义了一个字段,即NOT NULL。
如果我运行带有INSERT IGNORE值的查询null,它将插入一个零值行,而不是忽略null值。(即使数据类型无效的值也是如此)
CREATE TABLE all_numbers (
Numbers INT NOT NULL,
AssociatedNumbers INT NOT NULL
) ENGINE=InnoDB;
INSERT IGNORE INTO all_numbers (Numbers, AssociatedNumbers)
VALUES (1,2), (3,4), (5,6), (7,8), (null, null);产出如下:
Numbers AssociatedNumbers
1 2
3 4
5 6
7 8
0 0以下情况也是如此:
INSERT IGNORE INTO all_numbers (Numbers, AssociatedNumbers)
VALUES (1,2), (3,4), (5,6), (7,8), ('a', 'b');您是否知道为什么会发生这种情况,以及如何使MySQL只忽略查询中指定的无效值?(零而不是无效值实际上是不可取的!)
更新
即使在我启用了STRICT_ALL_TABLES模式之后,它仍然无法工作。以下是截图:


发布于 2016-01-20 19:47:03
我想你误解了IGNORE忽略了什么。它不进行值检查和忽略坏值,它只是忽略或绕过尝试插入这些坏值所导致的错误。从手册上
如果未指定“忽略”,则将触发错误的数据转换中止该语句。使用“忽略”时,无效值将调整为最接近的值并插入;将产生警告,但语句不会中止。您可以使用mysql_info() can函数确定实际插入到表中的行数。
数值列是零的“最近值”
如果尝试将不以数字开头的字符串存储到数字列中,MySQL服务器将存储0。 … 如果尝试将NULL存储到不使用空值的列中,则…MySQL服务器存储列数据类型的隐式默认值。通常,对于数值类型…,这是0。
正如在另一个答案中提到的,将模式设置为严格将阻止这种行为。可以在运行时使用以下查询在会话中设置此设置:
SET SESSION sql_mode = 'STRICT_ALL_TABLES';若要在服务器范围内执行此操作,请使用MySQL启动--sql-mode="STRICT_ALL_TABLES"或将sql-mode="STRICT_ALL_TABLES"添加到my.cnf配置文件中。
发布于 2016-01-20 17:55:00
你应该具体说明:
设置sql_mode = "strict_all_tables";
这将使检查更加严格,并给出正确的结果。
https://stackoverflow.com/questions/34906798
复制相似问题