如何在MySQL数据库表中的字段上添加“非空”约束?

3
我正在使用MySQL数据库服务器**(服务器版本:5.5.40-0ubuntu0.14.04.1-log - (Ubuntu))**。
数据库中有一个名为'users'的表,其中包含一个名为'full_name'的列。
以下是它的限制。
Name : full_name
Type : `varchar(255)`
Collation : `latin1_swedish_ci`
Attributes :
Null : No
Default : None
Extra :     

我在这一列 ('full_name') 遇到的问题是,从 PHP 代码中某个地方插入了一个值,尽管我添加了NOT NULL约束条件。
我希望能够避免这种情况的发生。即,不应该在此列中插入空/空白字符/NULL值。我想通过数据库表本身来实现,而不是对 PHP 代码进行修改。
请问有人能帮助我防止将这样的值插入到此列中吗?
另外还有一件事,这个表里面有一些记录在字段'full_name'中包含NULL值。我认为这些值是在我向列'full_name'添加NOT NULL约束之前就已经存在的。我还有一个疑问是,这些NULL值对该列有影响吗?
1个回答

2
您可以像这样添加检查约束条件:
full_name VARCHAR(45) CHECK (full_name <> '')

更新:

正如@vhu所指出的:

CHECK()被解析但被忽略为CREATE语句的一部分。

因此,您需要在users表的INSERT之前添加一个TRIGGER

这个TRIGGER将在INSERT之前被调用,它将检查要设置为a的值是否为空。 如果是真的,a将被设置为NULL:

CREATE TRIGGER `test_BINS` BEFORE INSERT ON `test` FOR EACH ROW 
IF new.`a` = '' THEN SET new.`a` = NULL; END IF; END;

test 是表的名称,test_BIN 是触发器的名称,a 是表 test 中的一个列名。

注意:此代码是由 MySQL Workbench 生成的。


哇,非常好。我不知道我们可以在列定义中这样做。 - segfault
不,它不起作用。CHECK()被解析但被忽略为CREATE语句的一部分。有关详细信息,请参见手册: “所有存储引擎都会解析CHECK子句,但会忽略它。” - vhu
@vhu - 你说得对,我已经用MySQL Workbench测试了这个约束条件,但它被忽略了。我必须添加一个触发器。 - Stéphane Eintrazi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接