MySQL的交叉表约束(MySQL Cross Table Constraint)

2019-10-17 02:29发布

我有三个表,表A中具有独特的主键是自动递增,而另外两个(表B和C)有有他们联系的第一个表的主键的外键约束的主键。

我想使维护,对于第二和第三表中的所有行不能包含任何重复的约束,和表A中的所有记录中有B或C的匹配记录

因此,基本上类型A的记录可以是一种类型的B或C,且必须是B或C.一个

有没有去使这种约束,而无需在MySQL触发器? 或者是触发必要吗?

谢谢你的帮助。

Answer 1:

你可以用一个“型”表:

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),应在一个插入时被照顾(所有填写应与强制执行要求交易完成)。



文章来源: MySQL Cross Table Constraint