2008-12-11 10 views
10

Ich habe eine Tabelle, die ein bisschen wie diese Schauspieler sieht (Vorname, Nachname, stage_name);MySQL - Set Standardwert für das Feld als String-Verkettung Funktion

Ich möchte stage_name aktualisieren, um einen Standardwert von

forename." ".surname 

dass

insert into actors(forename, surname) values ('Stack', 'Overflow'); 

produzieren würde den Rekord

'Stack'  'Overflow' 'Stack Overflow' 

Ist dies möglich, so haben?

Thanks :)

Antwort

14

MySQL unterstützt keine berechneten Spalten oder Ausdrücke in der DEFAULT Option einer Spaltendefinition.

Sie dies in einem Trigger tun können (MySQL 5.0 oder höher erforderlich):

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

Sie auch BEFORE UPDATE einen ähnlichen Trigger erstellen möchten.

Achten Sie auf NULL in Vor- und Nachname, weil concat NULL mit einer anderen Zeichenfolge eine NULL produziert. Verwenden Sie COALESCE() für jede Spalte oder die verkettete Zeichenfolge wie geeignet.

edit: Im folgenden Beispiel wird stage_name nur, wenn es NULL. Ansonsten können Sie die stage_name in Ihrer INSERT Anweisung angeben, und es wird erhalten bleiben.

+0

Ich habe nicht verwendet MySQL, aber wird dies immer die Spalte mit dem verketteten Wert überschreibt? Wenn Sie möchten, dass es als Standard verwendet wird, sollten Sie es überschreiben können, also würde ich denken, dass Sie auch eine Verschmelzung auf NEW.stage_name benötigen würden. –

+0

@ bill-karwin Ich bekomme einen Syntaxfehler auf 'NEW.aka = CONCAT (NEW.fname, '', NEW.lname)' ... siehe mein vollständiger Befehl [** hier auf pastebin **] (http : //pastebin.com/FiEUBgcu) ... irgendwelche Hinweise ?? – mOrloff

+0

@mOrloff, ich habe das Schlüsselwort 'SET' vergessen. Ich habe den obigen Code bearbeitet, um dies zu korrigieren. –

2

Nach 10.1.4. Data Type Default Values nein, man kann das nicht tun. Sie können nur eine Konstante oder CURRENT_TIMESTAMP verwenden.

OTOH wenn Sie sind ziemlich up-to-date, haben Sie wahrscheinlich eine trigger zu erreichen, die gleiche Sache nutzen könnten.

2

Mein erster Gedanke ist, wenn Sie die zwei Werte in anderen Feldern haben, was ist die zwingende Notwendigkeit, sie redundant in einem dritten Feld zu speichern? Es geht um Normalisierung und Effizienz.

Wenn Sie einfach den verketteten Wert speichern möchten, dann können Sie einfach eine Ansicht (oder IMSNHO noch besser eine gespeicherte Prozedur) erstellen, die die Werte in ein Pseudo actor Feld verkettet und Ihre Lesevorgänge aus der Ansicht/Sproc statt der Tabelle direkt.

Wenn Sie unbedingt den verketteten Wert speichern, müssen Sie dies auf zwei Arten umgehen konnte:

1) Verwenden Sie eine gespeicherte Prozedur Ihre Einsätze anstelle von gerade SQL zu tun. Auf diese Weise können Sie die Werte empfangen und einen Wert für das Feld bauen Sie wollen die Insert-Anweisung mit einer verketteten Wert für die Akteure Feld aufzufüllen dann zu bauen.

2) Also ich nicht zu viele Flammen ziehen, behandeln diesen Vorschlag mit Samthandschuhen. Verwenden Sie nur als letztes Mittel. Sie können dieses Verhalten hacken, indem Sie einen Trigger hinzufügen, um den Wert zu erstellen, wenn er null bleibt. Im Allgemeinen sind Trigger nicht gut.Sie fügen unsichtbare Kosten und Interaktionen zu relativ einfachen Interaktionen hinzu. Sie können jedoch das Feld CREATE TRIGGER verwenden, um das Feld actors zu aktualisieren, nachdem ein Datensatz eingefügt oder aktualisiert wurde. Hier ist die Referenzseite:

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

+0

Obwohl es den verketteten Wert standardmäßig vornimmt, bedeutet das nicht, dass der Standard in der Einfügung nicht überschrieben oder später aktualisiert werden kann –