示例:
表“人员”,“姓氏”栏目只能包含
中预定义的值表“名称”,列“姓氏”,其中包含可为此目的而接受的姓氏集合。
我可以通过设计实现这一点(即不涉及任何验证码)吗?在MyISAM桌上?没有?在InnoDB上?
谢谢。
答案 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没有异常,但您可以通过创建无效语句来终止执行(并因此“回滚”更改)