【问题标题】:NULL and DEFAULT value: MySql behavior does not seem coherentNULL 和 DEFAULT 值:MySql 行为似乎不一致
【发布时间】:2015-03-09 07:29:35
【问题描述】:

我正在调查 MySQL 在不同组合中应用 NULL 和 DEFAULT 关键字的行为,但有些行为我无法理解。

CREATE TABLE nullcheck 
(column1 varchar(10) NOT NULL, column2 varchar(10), column3 int NOT NULL)

INSERT INTO nullcheck VALUES 
("a", "b", 3), 
("a", NULL, 5), 
(NULL, "b", 2),
("a", "b", NULL)

第 1 列、第 2 列、第 3 列 a,b,3 一,空,5 ,b,2 a,b,0

因此,每种数据类型都采用默认值。这很好。

我们换一张桌子。

CREATE TABLE defaultcheck
(column1 varchar(10) NOT NULL, 
column2 varchar(10) DEFAULT "Ciao", 
column3 int NOT NULL DEFAULT 99)
INSERT INTO defaultcheck (column1, column2) VALUES  ("a", "b")
INSERT INTO defaultcheck (column1, column3) VALUES  ("a", 25)

第 1 列、第 2 列、第 3 列 a,b,99 a,Ciao,25

这也很好,因为默认值可以正常工作。 再说一句:

INSERT INTO defaultcheck (column1, column2, column3) VALUES  ("a", “b”, NULL)

这里出现错误,因为不能将 NULL 值分配给不可为空的列 3。 第一个问题:当默认子句是隐式的时,为什么 MySQL 不分配默认值,就像在上表中一样?

最后一句话:

INSERT INTO defaultcheck (column1, column2, column3) VALUES  (NULL, “b”, 25)

同样在这种情况下,我得到一个错误,因为 column1 不能为 NULL。 第二个问题:为什么 MySQL 的行为不像第一个表那样,没有为不可为空的列指定默认值会导致插入隐式设置的默认值?

谢谢。

PS 我正在使用 PHPMyAdmin。

【问题讨论】:

  • 使用表达式VALUES ('a','b', NULL),您明确声明“我确实想要该列中的NULL " - MySQL 正确地拒绝了该请求,因为 you 将该列定义为 NOT NULL
  • 你需要使用不同的sql_mode重新测试这些情况,尤其是STRICT_ALL_TABLES模式和STRICT_TRANS_TABLES模式,详情见此链接:dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict
  • 你确定你的空检查表的 INSERT 语句,因为它甚至没有在我的机器上编译..?
  • @AmiteshRai 是的,它在 phpmyadmin 上对我有用

标签: mysql


【解决方案1】:

CREATE TABLE nullcheck (column1 varchar(10) NOT NULL, column2 varchar(10), column3 int NOT NULL)

CREATE TABLE defaultcheck (column1 varchar(10) NOT NULL, column2 varchar(10) DEFAULT "Ciao", column3 int NOT NULL DEFAULT 99)

如果您说“column3 int NOT NULL”,则它不能为 Null;

这里:

    INSERT INTO defaultcheck (column1, column2, column3) VALUES  ("a", “b”, NULL)

or

INSERT INTO defaultcheck (column1, column2, column3) VALUES  (NULL, “b”, 25)

您“强制”在不能为空的字段中插入空值,它具有默认值,好的,但是您正在用空覆盖默认值。 与第二个问题相同,如果你设置一个字段NOT NULL,它永远不能为null,如果你在它不能为NULL的时候强制一个NULL,就会出现错误。

在 OP 中编辑机器人插入是 INTO 默认检查。

【讨论】:

  • 我理解你的第一个答案,但不是第二个:在第一个表中我没有设置默认值,当尝试插入 NULL 时,我没有收到错误,而是默认值对于我试图设置为 NULL 的字段。在第二个表中,在相同的条件下,我得到一个错误。
  • 在 OP 中,两个插入都用于默认检查,是否正确?
  • 然后修改OP,两个insert都是针对同一张表的。
  • 他们是正确的。我的意思是第一个插入块用于 nullcheck,第二个插入块用于 defaultcheck,我也测试 NULL 值。
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多