2010-08-28 9 views
0

J'ai une table appelée "Users" elle contient des champs tels que Id, ParentId, Name.
Ce que je veux est de modifier cette table pour ajouter une nouvelle relation d'auto-jointure de sorte que ParentId lie à Id, mais ParentId est nullable. Je veux écrire cette altération sql statment dans mysql sans laisser tomber la table.Comment modifier une table pour ajouter une relation d'auto-jointure?

Répondre

1

Voulez-vous dire que vous voulez ajouter une contrainte de clé étrangère? Si tel est le cas, consultez les documentations FOREIGN KEY Constraints. Voici un exemple, en commençant par la création d'une table simple:

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

Ajouter un index pour la colonne parent_id:

ALTER TABLE users 
ADD INDEX `parent_id` (`parent_id`); 

Ajouter la contrainte de clé étrangère:

ALTER TABLE users 
ADD CONSTRAINT `fk_parent_id` 
FOREIGN KEY `parent_id` (`parent_id`) 
REFERENCES `users` (`id`); 

Afficher la nouvelle table structure:

SHOW CREATE TABLE users; 

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `parent_id` (`parent_id`), 
    CONSTRAINT `fk_parent_id` 
    FOREIGN KEY (`parent_id`) 
    REFERENCES `users` (`id`) 
) ENGINE=InnoDB; 
2
alter table Users add constraint parent foreign key (ParentId) references 
    Users (Id); 
0

Notez que si vous travaillez avec une table contenant des données, la création de relations de clé étrangère échouera si des relations orphelines existent. Trouvez et corrigez les orphelins avant de créer des clés étrangères!

SELECT * FROM users O WH parent_id NOT IN (SELECT ID FROM users);

Questions connexes