Question

J'ai une table appelée « Utilisateurs » il certains domaines tels contiennent comme Id, ParentId, Nom.
Ce que je veux est de modifier ce tableau pour ajouter une nouvelle jointure réflexive relation de sorte que lien ParentId à Id, mais ParentId est annulable. Je veux écrire cet alter sql dans statment mysql sans laisser tomber la table.

Était-ce utile?

La solution

Voulez-vous dire que vous voulez ajouter une contrainte de clé étrangère? Si oui, consultez les FOREIGN KEY Contraintes docs. 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`);

Ajoutez 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 structure de la table:

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;

Autres conseils

alter table Users add constraint parent foreign key (ParentId) references
  Users (Id);

Notez que si vous travaillez avec une table qui contient des données, la création de relation de clé étrangère échouera si des relations existent orphelins. Détecter et corriger les orphelins avant la création de clés étrangères!

SELECT * FROM usersparent_id PAS (ID SELECT DE users);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top