一个表中的两列是否可以同时引用另一张表中的同一列作为外键?

5

我在数据库中有两个表:Person(人)和Pet(宠物)。

CREATE TABLE Person (
    id INT NOT NULL,
    PRIMARY KEY (id)
)

CREATE TABLE Pet (
    id INT NOT NULL,
    original_owner INT NOT NULL,
    current_owner INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (original_owner)
        REFERENCES Person(id),
    FOREIGN KEY (current_owner)
        REFERENCES Person(id)
)

我试图为每只宠物引用前任主人和当前主人。我也尝试过

CREATE TABLE Pet (
    id INT NOT NULL,
    original_owner INT NOT NULL,
    current_owner INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (original_owner, current_owner)
        REFERENCES Person(id, id)
)

并且

CREATE TABLE Pet (
    id INT NOT NULL,
    original_owner INT NOT NULL,
    current_owner INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (original_owner, current_owner)
        REFERENCES Person(id)
)

但我收到了以下错误:

错误代码:1215。无法添加外键约束

这个能行吗?还是我需要创建某种桥接表来实现?


可以实现,但是你必须单独声明外键。 - shad
我该如何声明外键,比第一个示例更分离? - Zymus
这是可能的,但我认为更被接受的做法是拥有第三个表格来保存宠物及其主人的信息。然后在需要当前和原始所有者时,可以选择最近的2个(或更多)。 - Dave Zych
2个回答

1
请尝试以下操作:

CREATE TABLE IF NOT EXISTS `pet` (  
  `id` int(11) NOT NULL,  
  `original_owner` int(11) NOT NULL,  
  `current_owner` int(11) NOT NULL,  
  PRIMARY KEY (`id`),  
  KEY `origin` (`original_owner`),  
  KEY `current` (`current_owner`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `pet`  
  ADD CONSTRAINT `pet_ibfk_2` FOREIGN KEY (`current_owner`) REFERENCES `person` (`id`),  
  ADD CONSTRAINT `pet_ibfk_1` FOREIGN KEY (`original_owner`) REFERENCES `person` (`id`);

“KEY origin(original_owner)”这个子句是否意味着给定的所有者只能是一个宠物的原始所有者(是否暗示唯一性)?如果是这样,那么就有问题了;例如,猫饲养员无法繁殖超过一只猫。外键约束看起来没问题;它们不能在CREATE TABLE中指定吗?(大多数DBMS都允许这样做;我不知道MySQL是否允许。) - Jonathan Leffler
这不是唯一键,只是索引。这应该完全正常工作。 - shad

0
问题出在我在脚本中定义表的顺序上。我先定义了 Pet,然后才是 Person。一旦我把 Person 放在 Pet 上面,它就正常工作了。我在问题中提供的示例是根据记忆编写的,因为我在发布时没有实际代码可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接