【发布时间】: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