Mysql 数据库的外键约束和构造问题

Problem with foreign key constraints and construction of Mysql DB

我在考虑连接两个 table 的方法时遇到了问题。 我有一个 table 具有操作 (RAD):

CREATE TABLE RAD (
  rad_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  spec_id INT NULL,
  predp_id INT NULL,
  predf_id INT NULL,
  strp_ID INT NULL,
  strf_ID INT NULL,
---more fileds---
  FOREIGN KEY (spec_id) REFERENCES SPEC(spec_id) ON DELETE SET NULL,    
  FOREIGN KEY (strp_ID) REFERENCES STRANKEP(strp_ID) ON DELETE CASCADE,
  FOREIGN KEY (strf_ID) REFERENCES STRANKEF(strf_ID) ON DELETE CASCADE,
  FOREIGN KEY (predp_id) REFERENCES PREDMETIP(predp_id) ON DELETE CASCADE,
  FOREIGN KEY (predf_id) REFERENCES PREDMETIF(predf_id) ON DELETE CASCADE
) ENGINE=InnoDB COLLATE utf8_general_ci;

还有一项 table 规格 (SPEC) 将根据谁制作:

CREATE TABLE SPEC (
  spec_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   ---more fileds---    
) ENGINE=InnoDB COLLATE utf8_general_ci;

如您所见,如果删除任何客户端(strp_ID 或 strf_ID),操作 rad_id(RAD) 行将被删除。 case(predp_id and predf_id).

也是如此

现在我想限制删除操作 rad_id(RAD 行)(如果它包含在规范中)。因此,当制定规范时,它会在 spec-id(RAD) 字段中插入 spec_id(SPEC)。

当规范被删除时,字段返回到 null 并且有效。 但是 它允许我删除操作 rad_id(RAD) 当它包含在规范 (SPEC) 中并且外键 spec_id 包含在 RAD table。我不能让这种情况发生。只有当它的 null 和规范键不存在时,它才应该删除。

问题是规范将包含多个操作 rad_id's(RAD),所以我不能将它与多一列 rad_id(RAD) 绑定作为外键。

我不知道如何解决这个问题。

     RAD TABLE  
rad_id  spec_id
1       1
2       1
3       1
4       null

        SPEC TABLE  
spec_id     rad_id-reference
1           1,2,3

如上所示 SPEC table 行将由 3 个 rad_id 组成,我需要一种方法来说明 rad_id 的 1,2 和 3 不能如果 spec_id 1 存在则删除。 rad_id4个可以删除

问题是我无法对 SPEC table 进行 rad_id 引用,这是一个由 3 rad_id 组成的外键。

我找到了一种方法来做到这一点。 http://sqlfiddle.com/#!9/50de2/1 如果将删除值更改为 1,它将失败。

     RAD TABLE  
rad_id-PK
1       
2       
3       
4       

        SPEC TABLE  
spec_id-PK
1
2

    RESTRICTDEL TABLE
res_id-PK  spec_id-FK  rad_id-FK
1           1           1
2           1           2
3           2           2
4           2           3
5           2           3

我制作了另一个 table,它将在一列中包含两个 PK id,它们是 FK。一个是 PK,它将是独一无二的,就像 spec_id 来自 SPEC table。第二个是 rad_id 可以加倍。我只需要设置 SET foreign_key_checks = 0;当我完成插入新规范时返回 1。 还需要使用 php 循环并为每个 rad_id 创建新的 resdel_id 条目。 这样,如果有一个 spec_id 连接它们,多个 rad_id 将不会被删除。