MySQL:我可以通过DB设计将一个表中的列值限制为另一个表中列中的值吗?

时间:2010-02-08 20:36:49

标签: sql mysql foreign-keys constraints

示例:

表“人员”,“姓氏”栏目只能包含

中预定义的值

表“名称”,列“姓氏”,其中包含可为此目的而接受的姓氏集合。

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

谢谢。

2 个答案:

答案 0 :(得分:3)

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

  

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

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

FOREIGN KEY (surname) REFERENCES names(surnames)

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

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

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

答案 1 :(得分:0)

对于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没有异常,但您可以通过创建无效语句来终止执行(并因此“回滚”更改)