【问题标题】:Mysql Column constraint as "not empty" / "required"Mysql 列约束为“非空”/“必需”
【发布时间】:2014-06-26 07:05:27
【问题描述】:

我们能否在 mysql 中指定一个列为“非空”/“必需”。要求是确保该字段在任何记录插入时都不会保持空白。

【问题讨论】:

标签: mysql


【解决方案1】:

我假设您也不希望表格中允许出现空白(空字符串,而不是 NULL)值。

通常,这就是 CHECK 约束的用途。你做类似的事情

CREATE TABLE
        mytable
        (
        myfield NOT NULL VARCHAR(200),
        CHECK(myfield > '')
        )

但是,MySQL 解析约束但不强制执行它。您仍然可以插入空值。

要解决此问题,请创建BEFORE INSERT 触发器并在尝试插入空白值时发出信号:

CREATE TRIGGER
        tr_mytable_bi
BEFORE INSERT
ON      mytable
FOR EACH ROW
BEGIN
        IF NEW.myfield = '' THEN
                SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Blank value on mytable.myfield';
        END IF;
END;

如果您还想禁止更新空白值,请在 BEFORE UPDATE 上执行相同操作。

【讨论】:

    【解决方案2】:

    MySQL8现在有了值约束,可以让你在不使用触发器的情况下实现值约束

    例如:

    CREATE TABLE my_table (
        myfield VARCHAR(255) NOT NULL
            CONSTRAINT myfield_not_empty CHECK(
                LENGTH(myfield) > 0 
            )
    );
    

    将确保myfield 中的值永远不会为空

    【讨论】:

      【解决方案3】:

      使用NOT NULL

      它使输入成为必需
      但是一个不为空的字段你需要明确的验证脚本。

      例子:

      create table example(
        login_name varchar(16) not null
        pass_word varchar(32) not null
      );
      

      参考Wiki on Null (SQL)

      【讨论】:

      • 我使用了“NOT NULL”,但插入命令仍然运行良好,并且在表中插入了一行(使用 sqlyog)。但是通过命令行终端执行相同操作会引发错误(根据需要)。我不确定这是否是由于两者之间的模式差异。
      【解决方案4】:

      您可以按照@Ravinder 的回答将列定义为 NOT NULL

      除此之外,您还可以为列设置默认值。如果我们以前面的答案为例,我们可以这样做:

      create table example( login_name varchar(16) = null pass_word varchar(32) = null );

      如果这些列没有收到任何值,则默认插入 NULL。

      【讨论】:

      • 这是一个无效的create table 声明。 = NULL 应该做什么?
      • @a_horse_with_no_name:是的,我的错。我在这里声明了一个存储过程的语法,我们要在其中为表的列设置默认值。
      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多