MySQL 中特定数据库约束的解决方案

Solution for specific database constraint in MySQL

我需要在数据库中拥有:

Id  C1  C2  C3    
1   T   R   P1    
2   T   R   P2    
3   T1  R   P1    
4   T1  R   P2    
5   T2  U   P1    
6   T2  U   P2

鉴于以上数据,数据库不允许有:

7   T1  U   P1    
8   T1  U   P2

这意味着:

如果C1中出现值T1,C2中出现R,
那么没有其他包含 T1 的行与 R 以外的其他值必须发生。

或者,另一种解释:

令 x 为 C1 列 = 值 1,y 列 C2 = 值 2。如果 DB 中存在具有给定值的 (x,y),则除 2 之外的其他 y 值一定不会出现其他值 1,但是值 2 可能与 1

以外的其他值一起出现

或者,新值示例:

1 2 1
1 2 2
2 2 1
2 2 2
3 2 1
3 2 2

有效。 鉴于数据库的这种状态,必须无法插入以下行:

1 1 2
2 1 1
3 3 2

基本上这意味着在给定原始数据库状态的情况下,第一列中的 1 只能与第二列中的 2 一起出现。

是否可以实现这种约束? (除了在后端代码或触发器中检查它)

此约束意味着您的架构未正确规范化。您应该从此 table 中删除 C2 列,然后像这样创建另一个 table:

CREATE TABLE C1_C2 (
    C1 INT PRIMARY KEY,
    C2 INT
);

那么你原来的table应该有C1作为C1_C2.C1的外键,你可以用一个JOIN把两个table结合起来s.