我将MySQL列设置为“NOT NULL”,但我仍然可以插入一个空值

时间:2011-08-31 23:40:43

标签: mysql database

在MySQL中,我有一个表,其中Column1为NOT NULL:

create table myTable 
(
    Column1 int not null,
    Column2 int not null
)

我仍然可以像这样插入一个空值:

INSERT INTO `myTable` ( `Column1` ,  `Column2` )
VALUES ( '66', '' );

如何让MySQL列也禁止blankstring?

5 个答案:

答案 0 :(得分:9)

EMPTY STRINGS

在ORACLE中,空字符串用于表示 NULL。但是,在几乎所有其他内容中,空字符串仍然是一个字符串,因此不是NULL。


<强> INTS

在您的情况下,您实际上是将STRINGS插入INT列。这会强制进行隐式 CAST操作。

当你的RDBMS将字符串''转换为INT时,它必须得到值0.因为0不是NULL,所以它会被插入。

更有效的测试是:

INSERT INTO `plekz`.`countries` (`Column1 ` , `Column2`)
VALUES (66, NULL);


修改

对不起,我只读了一半你的问题。您还会问如何停止插入''

您的第一个问题是您正在插入STRINGS,并且该表被定义为具有INT字段。您可以对插入的数据设置约束,但这些约束将在转换为INT之后应用值。除非您想要阻止值0也被插入,否则您无法对该表执行任何操作来阻止此情况。

最好的办法是解决为什么要插入字符串。您可以使用一个存储过程来获取并检查字符串,然后再将它们转换为INT,然后插入它们。或者,更好的是,您可以在客户端应用程序中进行检查。

技术上可用的选项是使字段为CHAR字段,然后对字段设置约束,以防止插入''。我会 强烈 建议不要这样做。

答案 1 :(得分:8)

您正在插入空字符串,而不是NULL。该约束仅针对NULL值,并且当将它们转换为INT时,您的数据库似乎不会将空字符串强制转换为NULL(这引发了为什么要将字符串文字插入INT列的其他问题...)< / p>

答案 2 :(得分:4)

MySQL,如何禁止空字符串:

  1. 创建表格:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. 在插入之前创建您的&#39;触发检查blankstring和disallow。

    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> signal sqlstate '45000';
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. 尝试在列中插入null和blankstring:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1644 (45000): Unhandled user-defined exception condition
    
    mysql> insert into yar values(NULL);
    ERROR 1048 (23000): Column 'val' cannot be null
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    
  4. 最后,Grumble自我抨击最近负责在postgresql上挑选mysql的人。

答案 3 :(得分:3)

正如马丁所说,取决于你的RDBMS。 Oracle将空字符串视为NULL,而其他字符串则不。请参阅此SO post

答案 4 :(得分:0)

NULL不等于空虚。在MySQL中,每个列条目都有一个额外的字节来保存“is null”信息。为了节省空间,如果空状态不向数据模型添加任何内容,则通常将列定义为“非空”以节省此额外字节。