我使用的是 MySQL InnoDB 数据库,里面有很多表。我想要做的是(从数据库内部)强制执行一个约束,这样一个键可能存在于两列之一(在两个单独的表中)但不能同时存在。我会尽量使这一点更清楚。
假设我有两个表,TableA 和 TableB。这两个表都有很多列,但它们有一个共同的列,称为 SpecialID (int 255)。
现在,这两个表都有很多行,从网络应用程序的 PHP 端来看,TableA 中的 SpecialID 列永远不应包含 TableB 的 SpecialID 列中的整数,反之亦然.换句话说,任何时候都不应该在 TableA 和 TableB 的 SpecialID 列中找到整数。
我相当有信心我已经从 PHP 端强制执行此关系,但是我希望能够从数据库内部强制执行此关系,只是要格外小心,就好像我最终得到了相同的值一样在这两个表中,这将是灾难性的。
这甚至可能是不可能的,但我想我会把它扔掉,因为它看起来可能是。这有点像“外部唯一性约束”。我做了一些研究,但根本没有发现任何东西,甚至没有人要求这样的东西,所以也许我只是在寻找错误的东西?
最佳答案
这是一个解决方案:
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
只能被一个表或另一个表引用,而不能同时被两者引用。
关于mysql - MySQL InnoDB 数据库可以有外列唯一性约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035949/