【问题标题】:A constraint to prevent the insert of an empty string in MySQL防止在 MySQL 中插入空字符串的约束
【发布时间】:2010-03-25 09:09:33
【问题描述】:

this question 中,我学习了如何防止插入 NULL 值。但是,不幸的是,无论如何都会插入一个空字符串。除了在 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 ('');

我想阻止。

【问题讨论】:

  • 我可以看到您需要防止空字符串,并且我也被教导要防止在数据库级别插入错误数据。但经验告诉我,你需要根据约束的复杂性做出谨慎的成本/收益判断。一些约束在应用程序级别很容易表达,但在数据库级别可能会变得非常麻烦。更糟糕的是,如果您做得过火,他们往往会将您完全锁定在数据库供应商中。只是我的 0.02 美元。
  • 空字符串与 null 不同,因此没有“无论如何”。

标签: mysql constraints


【解决方案1】:

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

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

在 8.0 版之前,MySQL 对约束的支持有限。来自MySQL Reference Manual

CHECK 子句被所有存储引擎解析但忽略。

正如人们所指出的,如果您必须坚持使用旧版本,请使用 triggers 作为解决方法。

以后你可能想take a look at PostgreSQL,被many people认为对数据完整性有更好的支持(在other things中)。

【讨论】:

  • 所以...... oracle 中的内容由 NOT NULL 约束处​​理,需要一个 NOT NULL 约束和 MySQL 中的两个触发器(更新之前和插入之前)。如果我喜欢抛出错误,还有一些黑客攻击,根据这个问题:stackoverflow.com/questions/24。查看 PostgreSQL 的建议可能是这里最好的建议!谢谢!
  • PostgreSQL 也有其自身的局限性。然而,有很多人从未走出过他们(第一次学习的)PHP/MySQL 世界,我真的建议至少为他们呼吸一次新鲜空气,以找出他们缺少的东西。如果你还想要,那就回去吧;-)
  • 10.2.1 (MDEV-7563) 支持 MariaDB 中的 CHECK CONSTRAINT。
  • MySQL 8.0 对 CHECK 约束有更好的支持:dev.mysql.com/doc/refman/8.0/en/…
【解决方案2】:

您可以使用触发器来防止插入空白字符串。

它不是很快,不是很简洁也不是很漂亮,但是......

示例:

  1. 创建你的表:

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

    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 和空白字符串:

    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)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多