NULL和DEFAULT值:MySql行为似乎不一致

时间:2015-01-11 11:41:30

标签: mysql

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

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)

column1,column2,column3 A,B,3 一个,NULL,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)

column1,column2,column3 A,B,99 一,侨,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。

1 个答案:

答案 0 :(得分:0)

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)

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

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