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 将不会被删除。
我在考虑连接两个 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 将不会被删除。