Come modificare una tabella per aggiungere un self join relazione?
-
01-10-2019 - |
Domanda
Ho una tabella chiamata "Utenti" che contengono alcuni campi come Id, ParentId, Nome.
Quello che voglio è quello di modificare questa tabella per aggiungere nuove auto join relazione in modo che puntano a ParentId Id, ma ParentId è annullabile.
Voglio scrivere questa statment sql alter in MySQL senza far cadere la tabella.
Soluzione
Vuoi dire che si desidera aggiungere un vincolo di chiave esterna? Se è così, vedere i vincoli FOREIGN KEY Documenti. Ecco un esempio, partendo con la creazione di una tabella semplice:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Aggiungi un indice per la colonna parent_id
:
ALTER TABLE users
ADD INDEX `parent_id` (`parent_id`);
Aggiungere il vincolo di chiave esterna:
ALTER TABLE users
ADD CONSTRAINT `fk_parent_id`
FOREIGN KEY `parent_id` (`parent_id`)
REFERENCES `users` (`id`);
Mostra la nuova struttura della tabella:
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;
Altri suggerimenti
alter table Users add constraint parent foreign key (ParentId) references
Users (Id);
Si noti che se si sta lavorando con una tabella che contiene i dati, la creazione di relazione di chiave esterna non riuscirà se esistono relazioni orfani. Trovare e orfani fix prima di creare chiavi esterne!
SELECT * FROM WHERE users
parent_id
NOT IN (SELECT MATR FROM users
);