【问题标题】:How to add 'not empty' constraint on a field in table in MySQL database?如何在 MySQL 数据库表中的字段上添加“非空”约束?
【发布时间】:2015-09-01 08:17:31
【问题描述】:

我正在使用 MySQL 数据库服务器**(服务器版本:5.5.40-0ubuntu0.14.04.1-log - (Ubuntu))**。

在数据库中有一个名为'users' 的表。在表'users' 中有一列标题为'full_name'

以下是对它的限制

Name : full_name
Type : `varchar(255)`
Collation : `latin1_swedish_ci`
Attributes :
Null : No
Default : None
Extra :     

我在本专栏中面临的问题('full_name') 是 PHP 代码 empty 值被插入到本专栏中的一些地方,尽管我添加了一个 NOT NULL 约束。

我想避免在任何地方做那件事。那是空/空白/空白字符/NULL不应插入此列。我想从数据库表本身来做,而不是在 PHP 代码中进行修改。

有人可以帮我防止在此列中插入此类值吗?

还有一点是该表中的记录很少,在字段'full_name' 中包含NULL 值。我认为在我将 NOT NULL 约束添加到 'full_name' 列之前,这些值已经存在。我的另一个疑问是这些NULL 值会影响列吗?

【问题讨论】:

    标签: php mysql database null constraints


    【解决方案1】:

    您可以像这样添加检查约束:

    full_name VARCHAR(45) CHECK (full_name <> '')
    

    更新:

    正如@vhu 指出的那样:

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

    因此,您必须在 INSERT 之前为 users 表添加 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是TRIGGER的名称,a是表test的一列的名称。

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

    【讨论】:

    • 哇,非常好。我不知道我们可以在列定义中做到这一点
    • 不,它不起作用。 CHECK() 被解析,但作为 CREATE 语句的一部分被忽略。详情见manual“CHECK 子句被解析,但被所有存储引擎忽略。”
    • @vhu - 你说得对,我已经用 MySQL Workbench 测试了这个约束,他被忽略了。我必须添加一个触发器。
    猜你喜欢
    • 2018-05-28
    • 2013-08-26
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多