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

zac*_*987 9 mysql database

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

create table myTable 
(
    Column1 int not null,
    Column2 int not null
)
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO `myTable` ( `Column1` ,  `Column2` )
VALUES ( '66', '' );
Run Code Online (Sandbox Code Playgroud)

如何让MySQL列也禁止blankstring?

Mat*_*lie 9

空的字符串

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


INTS

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

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

更有效的测试将是:

INSERT INTO `plekz`.`countries` (`Column1 ` , `Column2`)
VALUES (66, NULL);
Run Code Online (Sandbox Code Playgroud)


编辑

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

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

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

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


Dan*_*n J 8

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


Eri*_*ski 5

MySQL,如何禁止空字符串:

  1. 创建表:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建您的“插入前”触发器,以检查是否为blankstring并禁止使用。

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

最后,抱怨自己,并请最接近负责通过postgresql选择mysql的人员。