首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入忽略无效字段值实际上插入零

问插入忽略无效字段值实际上插入零
EN

Stack Overflow用户
提问于 2016-01-20 17:36:51
回答 2查看 1.1K关注 0票数 0

我已经在我的表中定义了一个字段,即NOT NULL。

如果我运行带有INSERT IGNORE值的查询null,它将插入一个零值行,而不是忽略null值。(即使数据类型无效的值也是如此)

代码语言:javascript
复制
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);

产出如下:

代码语言:javascript
复制
Numbers AssociatedNumbers
   1          2
   3          4
   5          6
   7          8
   0          0

以下情况也是如此:

代码语言:javascript
复制
INSERT IGNORE INTO all_numbers (Numbers, AssociatedNumbers)
    VALUES (1,2), (3,4), (5,6), (7,8), ('a', 'b');

您是否知道为什么会发生这种情况,以及如何使MySQL只忽略查询中指定的无效值?(零而不是无效值实际上是不可取的!)

更新

即使在我启用了STRICT_ALL_TABLES模式之后,它仍然无法工作。以下是截图:

​

​

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 19:47:03

我想你误解了IGNORE忽略了什么。它不进行值检查和忽略坏值,它只是忽略或绕过尝试插入这些坏值所导致的错误。从手册上

如果未指定“忽略”,则将触发错误的数据转换中止该语句。使用“忽略”时,无效值将调整为最接近的值并插入;将产生警告,但语句不会中止。您可以使用mysql_info() can函数确定实际插入到表中的行数。

数值列是零的“最近值”

如果尝试将不以数字开头的字符串存储到数字列中,MySQL服务器将存储0。 … 如果尝试将NULL存储到不使用空值的列中,则…MySQL服务器存储列数据类型的隐式默认值。通常,对于数值类型…,这是0。

正如在另一个答案中提到的,将模式设置为严格将阻止这种行为。可以在运行时使用以下查询在会话中设置此设置:

代码语言:javascript
复制
SET SESSION sql_mode = 'STRICT_ALL_TABLES';

若要在服务器范围内执行此操作,请使用MySQL启动--sql-mode="STRICT_ALL_TABLES"或将sql-mode="STRICT_ALL_TABLES"添加到my.cnf配置文件中。

票数 2
EN

Stack Overflow用户

发布于 2016-01-20 17:55:00

你应该具体说明:

设置sql_mode = "strict_all_tables";

这将使检查更加严格,并给出正确的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34906798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档