在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?
空的字符串
在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字段,然后对字段设置约束,防止''插入.我强烈建议不要这样做.
你要插入一个空字符串,而不是NULL.该约束仅针对NULL值,并且当将它们转换为INT时,您的数据库似乎不会将空字符串强制转换为NULL(这引发了为什么要将字符串文字插入INT列的其他问题...)
创建表:
mysql> create table yar (val VARCHAR(25) not null);
Query OK, 0 rows affected (0.02 sec)
Run Code Online (Sandbox Code Playgroud)创建您的“插入前”触发器,以检查是否为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)尝试将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的人员。
| 归档时间: |
|
| 查看次数: |
16013 次 |
| 最近记录: |