【发布时间】:2010-02-08 20:36:48
【问题描述】:
例子:
表“persons”,列“surname”只能包含预定义的值
表“names”,列“surnames”,其中将包含可用于此目的的姓氏集合。
我可以通过设计实现这一点(即不涉及任何验证代码)吗?在 MyISAM 表上?不?在 InnoDB 上?
谢谢。
【问题讨论】:
标签: sql mysql foreign-keys constraints
例子:
表“persons”,列“surname”只能包含预定义的值
表“names”,列“surnames”,其中将包含可用于此目的的姓氏集合。
我可以通过设计实现这一点(即不涉及任何验证代码)吗?在 MyISAM 表上?不?在 InnoDB 上?
谢谢。
【问题讨论】:
标签: sql mysql foreign-keys constraints
您要求的是外键约束。 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 表中存在的姓氏值 - 直到数据修复后才能应用。
【讨论】:
对于 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 没有异常,但您可以通过创建无效语句来终止执行(并因此“回滚”更改)
【讨论】: