2010-02-08 7 views
1

Exemple:MySQL: Puis-je contraindre les valeurs de colonne d'une table à des valeurs dans une colonne d'une autre table, par conception de base de données uniquement?

Table « personnes », la colonne « nom » ne peut contenir que des valeurs prédéfinies dans

Tableau « noms », colonne « noms », qui contiendrait une collection de noms acceptables dans le but.

Puis-je réaliser cela par conception (c'est-à-dire sans impliquer de code de validation)? Sur une table MyISAM? Non? Sur InnoDB?

Merci.

Répondre

3

Ce que vous demandez est une contrainte de clé étrangère. You'd need to use InnoDB - quote:

Pour les moteurs de stockage autres que InnoDB, le serveur MySQL la syntaxe parse FOREIGN KEY dans CREATE TABLE, mais ne pas utiliser ou stocker.

Pour ajouter une contrainte de clé étrangère dans l'instruction CREATE TABLE pour PERSONS:

FOREIGN KEY (surname) REFERENCES names(surnames) 

En utilisant une instruction ALTER TABLE si les tables existent déjà:

ALTER TABLE persons 
    ADD CONSTRAINT FOREIGN KEY (surname) REFERENCES names(surname) 

Sachez que si vous utiliser l'instruction ALTER TABLE, les données du tableau PERSONS ne peuvent contenir que des valeurs de nom de famille qui figurent dans le tableau NAMES.surname - il ne peut pas être appliqué jusqu'à ce que les données aient été corrigées.

+0

Un grand merci , vraiment utile! – Webmaster

0

Pour les tables MyISAM, vous pouvez obtenir la fonctionnalité souhaitée en utilisant des déclencheurs.

Par exemple (valider insert),

DELIMITER // 
CREATE DEFINER=`root`@`localhost` TRIGGER BEFORE INSERT ON persons 
FOR EACH ROW 
BEGIN 
    DECLARE tmp_surname varchar(100); 
    SELECT surname into tmp_surname FROM names WHERE surname = NEW.surname; 
    IF (tmp_surname IS NULL) THEN 
    INSERT INTO t1(id,value) VALUES('aaa'); #raise an 'exception' 
    END IF;  
END;// 
delimiter; 

Mysql n'a pas d'exceptions, mais vous pouvez mettre fin à l'exécution (et, par conséquent, les changements 'rollback') en créant une déclaration invalide

+0

Pouvez-vous donner plus de détails à ce sujet? – Webmaster

+0

Je vais ajouter un exemple pour valider l'insertion. Vous devrez faire la même chose pour la mise à jour – a1ex07