我正在寻找一个约束,以防止在MySQL中插入一个空string

好的,在这个问题中,我学会了如何防止插入一个NULL值。 但是,不幸的是,无论如何都插入了一个空string。 除了防止在PHP方面,我想使用像数据库约束,以防止这一点。 当然,在应用程序方面的检查是必要的,但我希望它是双方。

我被告知,无论应用程序在与数据库交谈,它都不应该在其中插入基本错误的数据。 所以…

CREATE TABLE IF NOT EXISTS tblFoo ( foo_id int(11) NOT NULL AUTO_INCREMENT, foo_test varchar(50) NOT NULL, PRIMARY KEY (foo_id) ); 

仍然会允许我这样做插入:

 INSERT INTO tblFoo (foo_test) VALUES (''); 

我想要阻止的

通常你会用CHECK约束来做到这一点:

 foo_test VARCHAR(50) NOT NULL CHECK (foo_test <> '') 

不幸的是MySQL对约束的支持有限。 从MySQL参考手册 :

CHECK子句被parsing,但被所有存储引擎忽略。

正如人们已经指出的那样,这就是为什么你必须使用触发器作为解决方法。

将来,您可能会想看看PostgreSQL , PostgreSQL被许多人认为对数据完整性(尤其是其他方面 )有更好的支持。

你可以使用触发器来防止插入空白string。

这不是快,不是很简洁,不漂亮,但…

例:

  1. 创build你的表格:

     mysql> create table yar (val VARCHAR(25) not null); Query OK, 0 rows affected (0.02 sec) 
  2. 创build“插入前”触发器来检查空白string并禁止。

     mysql> delimiter $ 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) mysql> delimiter ; 
  3. 尝试将null和blankstring插入到列中:

     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)