MySQL中特定数据库约束的解决方案
在DB中,我需要: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
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值。这似乎恰恰相反。