在MySQL中,我有一个表,其中Column1为NOT NULL:
create table myTable
(
Column1 int not null,
Column2 int not null
)
我仍然可以像这样插入一个空值:
INSERT INTO `myTable` ( `Column1` , `Column2` )
VALUES ( '66', '' );
如何让MySQL列也禁止blankstring?
答案 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> create table yar (val VARCHAR(25) not null);
Query OK, 0 rows affected (0.02 sec)
在插入之前创建您的&#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)
尝试在列中插入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)
最后,Grumble自我抨击最近负责在postgresql上挑选mysql的人。
答案 3 :(得分:3)
正如马丁所说,取决于你的RDBMS。 Oracle将空字符串视为NULL,而其他字符串则不。请参阅此SO post。
答案 4 :(得分:0)
NULL不等于空虚。在MySQL中,每个列条目都有一个额外的字节来保存“is null”信息。为了节省空间,如果空状态不向数据模型添加任何内容,则通常将列定义为“非空”以节省此额外字节。