2016-04-30 10 views
3

Ich habe eine Tabelle Table_A:postgresql Auslöser für die Befüllung neue Spalte auf Einsatz

\d "Table_A"; 
          Table "public.Table_A" 
    Column | Type |       Modifiers 
----------+---------+------------------------------------------------------------- 
id  | integer | not null default nextval('"Table_A_id_seq"'::regclass) 
field1 | bigint | 
field2 | bigint | 

und jetzt will ich eine neue Spalte hinzuzufügen. So laufe ich:

ALTER TABLE "Table_A" ADD COLUMN "newId" BIGINT DEFAULT NULL; 

jetzt habe ich:

\d "Table_A"; 
          Table "public.Table_A" 
    Column | Type |       Modifiers 
----------+---------+------------------------------------------------------------- 
id  | integer | not null default nextval('"Table_A_id_seq"'::regclass) 
field1 | bigint | 
field2 | bigint | 
newId | bigint | 

Und ich will newId für neue/aktualisierte Zeilen mit dem gleichen Wert wie id gefüllt werden.

Ich habe die folgende Funktion und Trigger:

CREATE OR REPLACE FUNCTION autoFillNewId() RETURNS TRIGGER AS $$ 
BEGIN 
    NEW."newId" := NEW."id"; 
    RETURN NEW; 
END $$ LANGUAGE plpgsql; 

CREATE TRIGGER "newIdAutoFill" AFTER INSERT OR UPDATE ON "Table_A" EXECUTE PROCEDURE autoFillNewId(); 

Nun, wenn ich einfügen etwas mit:

select * from "Table_A" where id = 97; 
id | field1 | field2 | newId 
----+----------+----------+------- 
97 |  1 |  97 | 

Hinweis:

INSERT INTO "Table_A" values (97, 1, 97); 

newId nicht gefüllt ist I auch versucht mit FOR EACH ROW her m ein paar Antworten hier in SO

Was fehlt mir?

+1

Sie benötigen einen 'BEFORE INSERT OR UPDATE'-Trigger. – Patrick

+0

danke, es funktioniert. Ich dachte, es wäre nur ein einfaches Detail, aber ich fand es schwer, es zu lösen :) Warum muss es ein VORHER sein? – pedrorijo91

+0

Siehe Antwort unten. – Patrick

Antwort

3

Sie benötigen einen BEFORE INSERT OR UPDATE ... FOR EACH ROW Trigger diese Arbeit zu machen:

CREATE TRIGGER "newIdAutoFill" 
INSERT OR UPDATE ON "Table_A" 
FOR EACH ROW EXECUTE PROCEDURE autoFillNewId(); 

A BEFORE Trigger erfolgt, bevor die neue Zeile eingefügt oder aktualisiert, so dass Sie Änderungen an den Feldwert immer noch machen. Ein AFTER Trigger ist nützlich, um einige Nebeneffekte zu implementieren, wie das Überprüfen von Änderungen oder das Kaskadieren von Änderungen an anderen Tabellen.

Standardmäßig sind die Trigger FOR EACH STATEMENT und der Parameter NEW ist nicht definiert (weil der Trigger nicht in einer Zeile arbeitet). Sie müssen also FOR EACH ROW angeben.

Verwandte Themen