【问题标题】:MySQL: Can I constraint column values in one table to values in a column in another table, by DB design only?MySQL:我可以仅通过 DB 设计将一个表中的列值限制为另一个表中的列中的值吗?
【发布时间】:2010-02-08 20:36:48
【问题描述】:

例子:

表“persons”,列“surname”只能包含预定义的值

表“names”,列“surnames”,其中将包含可用于此目的的姓氏集合。

我可以通过设计实现这一点(即不涉及任何验证代码)吗?在 MyISAM 表上?不?在 InnoDB 上?

谢谢。

【问题讨论】:

    标签: sql mysql foreign-keys constraints


    【解决方案1】:

    您要求的是外键约束。 You'd need to use InnoDB - quote:

    对于 InnoDB 以外的存储引擎,MySQL Server 解析 CREATE TABLE 语句中的 FOREIGN KEY 语法,但不使用或存储它。

    在 CREATE TABLE 语句中为 PERSONS 添加外键约束:

    FOREIGN KEY (surname) REFERENCES names(surnames)
    

    如果表已经存在,则使用 ALTER TABLE 语句:

    ALTER TABLE persons 
      ADD CONSTRAINT FOREIGN KEY (surname) REFERENCES names(surname)
    

    请注意,如果您使用ALTER TABLE 语句,PERSONS 表中的数据只能包含NAMES.surname 表中存在的姓氏值 - 直到数据修复后才能应用。

    【讨论】:

      【解决方案2】:

      对于 MyISAM 表,您可以通过使用触发器来实现所需的功能。

      例如(验证插入),

      DELIMITER // 
      CREATE DEFINER=`root`@`localhost` TRIGGER BEFORE INSERT ON persons
      FOR EACH ROW
      BEGIN
        DECLARE tmp_surname varchar(100);
        SELECT surname into tmp_surname FROM names WHERE surname = NEW.surname; 
        IF (tmp_surname IS NULL) THEN
          INSERT INTO t1(id,value) VALUES('aaa'); #raise an 'exception'
        END IF;    
      END;//
      delimiter;
      

      Mysql 没有异常,但您可以通过创建无效语句来终止执行(并因此“回滚”更改)

      【讨论】:

      • 你能详细说明一下吗?
      • 我将添加一个示例来验证插入。您需要为更新做同样的事情
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2019-11-25
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2023-01-17
      相关资源
      最近更新 更多