MySQL列设置为NOT NULL但仍允许NULL值

时间:2013-09-20 03:21:41

标签: mysql sql

我将每列设置为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 ('', '', '', '');

有关为何发生这种情况的任何想法?

4 个答案:

答案 0 :(得分:12)

您正在插入空字符串,空字符串不是NULL,以检查NULL错误:

INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES (NULL, NULL, NULL, NULL);

你会看到错误。 NOT NULL仅检查不是NULL的值。

要防止空字符串,您必须使用triggers,或者在执行NULL查询之前对服务器端编程语言执行检查以将空字符串转换为INSERTINSERT的示例触发器可能如下:(这只是一个示例)

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)

''不是NULLNULLNULL

这将失败:

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 演示。尝试取消注释上一个插入语句,触发器将不允许它成功。