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.

È stato utile?

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);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top