我使用的是MySQL InnoDB数据库,里面有很多表。我希望能够做的是强制(在数据库中)一个约束,使得一个键可以存在于两列之一(在两个单独的表中),但不能同时存在于两个列中。我会试着让这个更清楚。
假设我有两个表,TableA和TableB。这两个表都有很多列,但它们有一个共同的列,称为SpecialID(int 255)。
现在,这两个表都有很多行,而且从Web应用程序的PHP端,TableA中的SpecialID列永远不应该包含TableB的SpecialID列中的整数,反过来也是如此。 。换句话说,任何时候都不应该在TableA 和 TableB的SpecialID列中找到整数。
我相信我已经从PHP方面强制执行此操作,但是我希望能够在数据库中强制执行此关系,只是为了格外小心,就好像我最终得到了相同的值在这两个表中,都会是灾难性的。
这可能是不可能的,但我想我会把它扔出去,因为它似乎可以。这有点像“外国唯一性约束”。我做了一些研究,但根本没有发现任何东西,甚至没有人要求这样的东西,所以也许我可能只是在寻找错误的东西?
答案 0 :(得分:1)
这是一个解决方案:
CREATE TABLE Specials (
specialid INT AUTO_INCREMENT PRIMARY KEY,
type CHAR(1) NOT NULL,
UNIQUE KEY (id, type)
);
CREATE TABLE TableA (
id INT AUTO_INCREMENT PRIMARY KEY,
specialid INT NOT NULL,
type CHAR(1) NOT NULL DEFAULT 'A',
FOREIGN KEY (specialid, type) REFRENCES Specials(specialid, type)
);
CREATE TABLE TableB (
id INT AUTO_INCREMENT PRIMARY KEY,
specialid INT NOT NULL,
type CHAR(1) NOT NULL DEFAULT 'B',
FOREIGN KEY (specialid, type) REFRENCES Specials(specialid, type)
);
现在您需要确保TableA.type
始终为'A'且TableB.type
始终为'B'。您可以使用触发器执行此操作,或者为每个案例执行一行查找表的外键。
结果是Specials.type
可以是任何字母,但给定specialid
只有一个字母。 TableA
和TableB
中的行只能引用specialid
,type
与自己的type
匹配。这意味着任何给定的specialid
只能由一个表或另一个表引用,但绝不能同时引用。
答案 1 :(得分:0)
从我发现的情况来看,没有简单的方法可以做到这一点。由于我找不到任何东西,没有人提供解决方案,我认为事实上不可能(至少,不是很容易)。
对于我自己的项目,我最终走了一条不同的路线来实现我的目标。
在这个问题上的讨论可能对任何搜索这些内容的人都有用: Enforce unique values across two tables 不过,我自己也没试过。
如果我遇到任何更好的事情(或者有人在这里发布更好的答案),那么我将根据需要更新我的回复和/或标记其他人的回答。