mysql - 如何防止两个引用共享同一个主键

标签 mysql sql

我有一个公用表,该表被数据库中的其他两个表引用。另外两个表的主键也是外键,指向公用表主键的值。

我想知道有没有办法,MySQL 可以防止两个表具有相同的值作为引用? 我的想法是这样的:

logins instance should be only in one table (students or professors)

登录行应在两个表(学生或教授)之一中引用,但不能同时在两个表中引用。

最佳答案

CREATE TABLE common (
  id INT PRIMARY KEY,
  type CHAR(1) NOT NULL,
  UNIQUE KEY (id, type)
);

INSERT INTO common (id, type) VALUES (1, 'A'), (2, 'B');

CREATE TABLE typeA (
  id INT PRIMARY KEY,
  type CHAR(1) NOT NULL DEFAULT 'A',
  FOREIGN KEY (id, type) REFERENCES common(id, type)
);

INSERT INTO typeB (id, type) VALUES (1, 'A'); -- OK
INSERT INTO typeB (id, type) VALUES (2, 'A'); -- FAIL

CREATE TABLE typeB (
  id INT PRIMARY KEY,
  type CHAR(1) NOT NULL DEFAULT 'B',
  FOREIGN KEY (id, type) REFERENCES common(id, type)
);

INSERT INTO typeB (id, type) VALUES (1, 'B'); -- FAIL
INSERT INTO typeB (id, type) VALUES (2, 'B'); -- OK

您需要一些方法来强制 type 为每个子表中的正确值。例如触发器或查找表的另一个外键。 MySQL 不支持任何存储引擎中的CHECK 约束。

关于mysql - 如何防止两个引用共享同一个主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137215/

相关文章:

sql - 如何更新postgresql中的xml数据类型列

php - 不正确的整数值 SQL 错误

sql - 在 SQL 报告服务中直观地表示非规范化数据集

mysql - 将某些字段(仅结构)从另一个表复制到现有表中

mysql - 组合两个选择查询

mySQL检索按顺序重复一个值的记录

Java:无法使用 MySQL 中的 "USE"关键字?

php - 如何在此数据库模式中创建 hasManyTrough Eloquent 关系?

mysql - 我应该如何更改我的查询?

sql - 检查 Id 为 Identity 的表中的重复记录