我有三个表,表A中具有独特的主键是自动递增,而另外两个(表B和C)有有他们联系的第一个表的主键的外键约束的主键。
我想使维护,对于第二和第三表中的所有行不能包含任何重复的约束,和表A中的所有记录中有B或C的匹配记录
因此,基本上类型A的记录可以是一种类型的B或C,且必须是B或C.一个
有没有去使这种约束,而无需在MySQL触发器? 或者是触发必要吗?
谢谢你的帮助。
我有三个表,表A中具有独特的主键是自动递增,而另外两个(表B和C)有有他们联系的第一个表的主键的外键约束的主键。
我想使维护,对于第二和第三表中的所有行不能包含任何重复的约束,和表A中的所有记录中有B或C的匹配记录
因此,基本上类型A的记录可以是一种类型的B或C,且必须是B或C.一个
有没有去使这种约束,而无需在MySQL触发器? 或者是触发必要吗?
谢谢你的帮助。
你可以用一个“型”表:
CREATE TABLE Type
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
究竟有2行(多达你需要的不同亚型表:
INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;
超类型表(包括列引用“类型”):
CREATE TABLE A
( a_id INT NOT NULL AUTO_INCREMENT
, type_code CHAR(1) NOT NULL
, PRIMARY KEY (a_id)
, UNIQUE KEY (type_code, a_id)
, FOREIGN KEY (type_code)
REFERENCES Type (type_code)
) ;
亚型表(即现在引用的主键和类型代码的组合:
CREATE TABLE B
( a_id INT NOT NULL
, type_code CHAR(1) NOT NULL DEFAULT 'B'
, PRIMARY KEY (type_code, a_id)
, FOREIGN KEY (type_code, a_id)
REFERENCES A (type_code, a_id)
, CHECK (type_code = 'B')
) ;
CREATE TABLE C
( a_id INT NOT NULL
, type_code CHAR(1) NOT NULL DEFAULT 'C'
, PRIMARY KEY (type_code, a_id)
, FOREIGN KEY (type_code, a_id)
REFERENCES A (type_code, a_id)
, CHECK (type_code = 'C')
) ;
上面会做工精细,如果仅仅MySQL的已经implemeneted CHECK
约束。 但目前还没有。 因此,要绝对确保你所有的规格执行,而不是'B'
类型的数据插入C
表,你就必须添加2个“型”表(并删除无用的在MySQL CHECK
约束):
CREATE TABLE TypeB
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
CREATE TABLE TypeC
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
与正好1行,每行:
INSERT INTO TypeB (type_code)
VALUES ('B') ;
INSERT INTO TypeC (type_code)
VALUES ('C') ;
和附加FKS:
ALTER TABLE B
ADD FOREIGN KEY (type_code)
REFERENCES TypeB (type_code) ;
ALTER TABLE C
ADD FOREIGN KEY (type_code)
REFERENCES TypeC (type_code) ;
有了这些限制,表A中的每行,将或者B或C型的,这将是在相应的表(B或C)和从来没有在这两者。
如果你也想确保他们会在只有一个表(永不既不B或C),应在一个插入时被照顾(所有填写应与强制执行要求交易完成)。