2016-10-26 4 views
-1

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

+3

Oui, vous pouvez. Les tables se réfèrent parfois à elles-mêmes. –

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.