mysql - MySQL InnoDB 数据库可以有外列唯一性约束吗?

标签 mysql innodb

我使用的是 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 只能是一个字母。 TableATableB 中的行只能引用 specialidtype 与其自身的 type 相匹配。这意味着任何给定的 specialid 只能被一个表或另一个表引用,而不能同时被两者引用。

关于mysql - MySQL InnoDB 数据库可以有外列唯一性约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035949/

相关文章:

php - InnoDB表锁定用于写入但允许读取

php - Mysql 表插入性能

MySQL 重启失败,InnoDB me alloc error 12

mysql - 当使用星号(通配符)运算符执行搜索时,MySQL 将如何使用 FT 索引?

Mysql地理空间点数据库

php - 如何使用 Laravel 迁移将字符串列类型转换为整数?

php - 合并所有表以获得结果

Mysql 搜索 - InnoDB 和事务与 MyISAM 的全文搜索

mysql - MySQL 仍然是免费/开源数据库的不错选择吗?

mysql - mysql 表中带有变音符号 - Ç - 的数据