我将每列设置为NOT NULL
但由于某种原因,我仍然可以在每列中添加NULL
值。这是我的表信息(创建语法):
CREATE TABLE `addresses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(100) NOT NULL,
`city` varchar(100) NOT NULL,
`state` varchar(4) NOT NULL,
`zip` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4545 DEFAULT CHARSET=utf8;
以下是适用的示例INSERT
:
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES ('', '', '', '');
有关为何发生这种情况的任何想法?
答案 0 :(得分:12)
您正在插入空字符串,空字符串不是NULL
,以检查NULL
错误:
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES (NULL, NULL, NULL, NULL);
你会看到错误。 NOT NULL
仅检查不是NULL
的值。
要防止空字符串,您必须使用triggers,或者在执行NULL
查询之前对服务器端编程语言执行检查以将空字符串转换为INSERT
。
INSERT
的示例触发器可能如下:(这只是一个示例)
CREATE TRIGGER avoid_empty
BEFORE INSERT ON addresses
FOR EACH ROW
BEGIN
IF street = '' THEN SET street = NULL END IF;
END;
答案 1 :(得分:2)
尝试以下
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES (NULL, NULL, NULL, NULL);
以上将无效
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES ('', '', '', '');
上面插入空字符串
空字符串具体表示该值设置为空; null表示未设置该值。
防止插入空字符串检查此SO问题
I'm looking for a constraint to prevent the insert of an empty string in MySQL
答案 2 :(得分:1)
''
不是NULL
,NULL
是NULL
这将失败:
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES (NULL, NULL, NULL, NULL);
答案 3 :(得分:1)
如果您可以控制表中的所有插入,那么您可以在客户端代码中检查空字符串,或者如果您希望MySQL返回错误,您可以在NULLIF()
函数中包含插入值。假设你使用php,你的INSERT语句可能看起来像
INSERT INTO addresses(city, address, state, zip)
VALUES (NULLIF(:address, ''), NULLIF(:city, ''), NULLIF(:state, ''), NULLIF(:zip, ''));
防止插入空字符串的另一种方法是使用BEFORE INSERT
触发器
CREATE TRIGGER tg_bi_addresses
BEFORE INSERT ON addresses
FOR EACH ROW
SET NEW.address =
CASE WHEN
CHAR_LENGTH(NEW.address) = 0 OR
CHAR_LENGTH(NEW.city) = 0 OR
CHAR_LENGTH(NEW.state) = 0 OR
CHAR_LENGTH(NEW.zip) = 0 THEN NULL
ELSE NEW.address
END;
这个想法是检测一个空字符串并违反其中一个字段的NOT NULL
约束。如果您使用的是MySQL 5.5或更高版本,则可以使用SIGNAL
。
这是 SQLFiddle 演示。尝试取消注释上一个插入语句,触发器将不允许它成功。