Puis-je avoir une colonne dans une table comme clé étrangère pour une autre colonne du tableau? Par exemple, si une colonne est OrderId
et une autre colonne est RelatedOrderId
, OrderId
peut-elle être une "clé étrangère" pour RelatedOrderId
? L'idée derrière une telle relation serait qu'elle dirait à quiconque regarde la table que ces deux colonnes peuvent avoir des valeurs qui se chevauchent.SQL, clés étrangères dans la même table
-1
A
Répondre
2
Cela peut être aussi proche que vous pouvez obtenir:
CREATE TABLE `a9` (
`orderId` int(11) NOT NULL,
`relatedOrderId` int(11) DEFAULT NULL,
PRIMARY KEY (`orderId`),
KEY `abcd3` (`relatedOrderId`),
CONSTRAINT `abcd3` FOREIGN KEY (`relatedOrderId`) REFERENCES `a9` (`orderId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert a9(orderId,relatedOrderId) values (1,null); -- success
insert a9(orderId,relatedOrderId) values (2,3); -- Error 1452
insert a9(orderId,relatedOrderId) values (2,1); -- success
Et l'intégrité référentielle est pas très fort avec une NULL
dans la colonne relatedOrderId
. Mais au moins, il suggère que sinon NULL
alors il est valide.
Pour obtenir une référence circulaire , il faudrait faire ce qui suit qui semble louche.
insert a9(orderId,relatedOrderId) values (1,null); -- success
insert a9(orderId,relatedOrderId) values (2,1); -- success
update a9 set relatedOrderId=2 where orderId=1; -- success
select * from a9;
+---------+----------------+
| orderId | relatedOrderId |
+---------+----------------+
| 2 | 1 |
| 1 | 2 |
+---------+----------------+
Pardonnez les types de données choisis. Ce n'est qu'un exemple.
Oui, vous pouvez. Les tables se réfèrent parfois à elles-mêmes. –