2008-12-11 11 views

Répondre

14

MySQL ne prend pas en charge les colonnes ou expressions calculées dans l'option DEFAULT d'une définition de colonne.

Vous pouvez le faire dans un déclencheur (MySQL 5.0 ou plus nécessaire):

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
END 

Vous pouvez également créer un déclencheur similaire BEFORE UPDATE.

Faites attention à NULL dans le prénom et le nom de famille, car la concaténation d'un NULL avec une autre chaîne produit un NULL. Utilisez COALESCE() sur chaque colonne ou sur la chaîne concaténée selon le cas.

éditer: L'exemple suivant définit stage_name uniquement s'il s'agit de NULL. Sinon, vous pouvez spécifier le stage_name dans votre instruction INSERT, et il sera conservé.

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    IF (NEW.stage_name IS NULL) THEN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
    END IF; 
END 
+0

Je ne l'ai pas utilisé MySQL, mais cette écrase toujours la colonne avec la valeur concaténés? Si vous voulez qu'il agisse par défaut, vous devriez pouvoir le remplacer, donc je pense que vous auriez besoin d'une fusion sur le NEW.stage_name aussi. –

+0

@ bill-karwin Je reçois une erreur de syntaxe sur 'NEW.aka = CONCAT (NEW.fname, '', NEW.lname)' ... voir ma commande complète [** ici sur pastebin **] (http : //pastebin.com/FiEUBgcu) ... des pointeurs ?? – mOrloff

+0

@mOrloff, j'ai oublié le mot clé 'SET'. J'ai modifié le code ci-dessus pour corriger cela. –

2

Selon 10.1.4. Data Type Default Values non, vous ne pouvez pas le faire. Vous ne pouvez utiliser qu'une constante ou CURRENT_TIMESTAMP. OTOH Si vous êtes assez à jour, vous pouvez probablement utiliser un trigger pour accomplir la même chose.

2

Ma première pensée est que si vous avez les deux valeurs dans d'autres domaines ce qui est le besoin impérieux de les stocker dans un troisième redondante champ? Cela va à l'encontre de la normalisation et de l'efficacité. Si vous souhaitez simplement stocker la valeur concaténée, vous pouvez simplement créer une vue (ou mieux encore une procédure stockée IMSNHO) qui concatène les valeurs dans un champ pseudo actor et effectuer vos lectures depuis la vue/sproc au lieu de la table directement.

Si vous devez absolument stocker la valeur concaténée vous pouvez gérer cela de deux façons:

1) Utilisez une procédure stockée pour faire des insertions au lieu de SQL droite. De cette façon, vous pouvez recevoir les valeurs et construire une valeur pour le champ que vous souhaitez remplir puis créer l'instruction d'insertion incluant une valeur concaténée pour le champ des acteurs.

2) Donc, je ne tire pas trop de flammes, traitez cette suggestion avec des gants pour enfants. Utiliser seulement en dernier recours. Vous pouvez pirater ce comportement en ajoutant un déclencheur pour générer la valeur si elle est vide. Généralement, les déclencheurs ne sont pas bons.Ils ajoutent un coût et des interactions invisibles à des interactions relativement simples. Vous pouvez cependant utiliser CREATE TRIGGER pour mettre à jour le champ des acteurs après l'insertion ou la mise à jour d'un enregistrement. Voici la page de référence:

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

Bien que la valeur concaténée par défaut, cela ne signifie pas que la valeur par défaut ne peut pas être remplacée dans l'insertion ou mis à jour plus tard –

Questions connexes