Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中特定数据库约束的解决方案_Mysql_Database_Unique Constraint - Fatal编程技术网

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

MySQL中特定数据库约束的解决方案,mysql,database,unique-constraint,Mysql,Database,Unique Constraint,在DB中,我需要: 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 鉴于上述数据,DB不允许有: 7 T1 U P1 8 T1 U P2 这意味着: 如果C1中出现T1值,C2中出现R值, 那么,包含T1且值不是R的其他行就不能出现 或者,另一种解释: 设x

在DB中,我需要:

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
鉴于上述数据,DB不允许有:

7   T1  U   P1    
8   T1  U   P2
这意味着:

如果C1中出现T1值,C2中出现R值,
那么,包含T1且值不是R的其他行就不能出现

或者,另一种解释:


设x为C1列=值1,y为C2列=值2。如果存在给定值的(x,y)(以DB为单位),则y值大于2的情况下不得出现其他值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
基本上,这意味着在给定原始DB状态的情况下,第一列中的1只能与第二列中的2一起发生


有可能实现这种约束吗?(除了在后端代码或触发器中检查此项之外)

此约束意味着您的模式未正确规范化。您应该从此表中删除
C2
列,然后创建另一个类似以下内容的表:

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

然后,您的原始表应该将
C1
作为
C1_C2.C1
的外键,并且您可以使用
JOIN
来组合这两个表。

此约束意味着您的模式没有正确规范化。您应该从此表中删除
C2
列,然后创建另一个类似以下内容的表:

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


那么您的原始表应该有
C1
作为
C1\u C2.C1
的外键,您可以使用
连接来组合这两个表。

您能详细说明一下约束逻辑吗??例如,这些行是否有效
(T1,P,P1)
(T1,P,P3)
(T1,R,P1)
(T1,R,P3)
您的示例与我上面指出的相同:(T1,R,P1),(T1,R,P2),(T1,U,P1),(T1,U,P2)正如我所见,不可能。C3可以有任何值。C1、C2、C3都有不同的数据类型。是的,但我还不确定约束是什么。。。我认为逻辑是:
如果存在(x,y,?)->不存在(x,z,?)
其中y='R'
反过来呢
如果存在(x,z,?)和z'R',
我可以插入
(x,'R',?)
?设x为C1列=值1,y为C2列=值2。如果存在给定值的(x,y)(以DB为单位),则y值大于2的情况下不得出现其他值1,但值2可以大于1的情况下出现。听起来很复杂,希望这能澄清一些问题。你能详细说明一下你的逻辑吗??例如,这些行是否有效
(T1,P,P1)
(T1,P,P3)
(T1,R,P1)
(T1,R,P3)
您的示例与我上面指出的相同:(T1,R,P1),(T1,R,P2),(T1,U,P1),(T1,U,P2)正如我所见,不可能。C3可以有任何值。C1、C2、C3都有不同的数据类型。是的,但我还不确定约束是什么。。。我认为逻辑是:
如果存在(x,y,?)->不存在(x,z,?)
其中y='R'
反过来呢
如果存在(x,z,?)和z'R',
我可以插入
(x,'R',?)
?设x为C1列=值1,y为C2列=值2。如果存在给定值的(x,y)(以DB为单位),则y值大于2的情况下不得出现其他值1,但值2可以大于1的情况下出现。听起来很复杂,希望这能澄清一些问题。是的,基本上这就是解决方案,除了我仍然需要一种机制来强化这样的想法,即如果C2和C3列在同一个表中,并且如果C2发生在新创建的表中C1列的特定值上,那么C2的特定值不能发生在C1的其他值上。但是,不管怎样,关于规范化,你是对的,你也证实了我的想法。非常感谢。这似乎与你问题中的约束相反。如果你像在原始问题中一样使用表格,就没有办法自动执行约束。您可以在插入
更新
之前使用触发器检查冲突。关于触发器,是的,您是对的!关于相反的事情,不,不是。我想说,这将是解决问题的另一种方式。谢谢你激励我!问题是每个C1值只能有一个C2值。您的评论说,对于每个C2值,只能有一个C1值。这似乎是相反的。是的,基本上这就是解决方案,除了我仍然需要一种机制来强化这样的想法,即如果C2和C3列在同一个表中,并且如果C2发生在新创建的表中C1列的特定值,那么C2的特定值不能发生在C1的其他值中。但是,不管怎样,关于规范化,你是对的,你也证实了我的想法。非常感谢。这似乎与你问题中的约束相反。如果你像在原始问题中一样使用表格,就没有办法自动执行约束。您可以在插入
更新
之前使用触发器检查冲突。关于触发器,是的,您是对的!关于相反的事情,不,不是。我想说,这将是解决问题的另一种方式。谢谢你激励我!问题是每个C1值只能有一个C2值。您的评论说,对于每个C2值,只能有一个C1值。这似乎恰恰相反。