2017-06-15 5 views
2

Ich habe eine Reihe von INSERT-Anweisungen mit unterschiedlicher Anzahl von Spalten für ihre jeweiligen Tabellen, muss ich diese Abfragen ausführen, wenn der Datensatz nicht bereits existiert. Ich habe versucht, dies alseinfügen oder aktualisieren in postgresql 9.1

implementieren
do $$ 
begin 
IF not exists (SELECT 1 FROM gst_type_customer WHERE name = 'Unregistered') THEN 
insert into gst_type_customer(create_date,write_date,create_uid,write_uid,name) values((now() at time zone 'UTC'),(now() at time zone 'UTC'),1,1,'Unregistered'); 
END IF; 
end 
$$ 

obwohl der obige Code funktioniert für einen Großteil der Anfragen, obwohl die Umsetzung würde eine Menge Zeit in Anspruch nehmen, so dass ich dachte, um eine gespeicherte Prozedur zu machen, die ich als

merge_check(insertquery,name[column to check for duplication],value) 

nennen könnte, aber ich bin kann die Einfügeabfrage nicht direkt ausführen.

bisher habe ich mit

CREATE OR REPLACE FUNCTION merge_tabla(data text) 
RETURNS void AS 
$BODY$ 
BEGIN 
    execute(data); 
END; 
$BODY$ 
LANGUAGE plpgsql 


select merge_table("insert into gst_type_customer(name) values('Unregistered')") 

aber ich erhalte eine Fehlermeldung, dass

Spalte "insert into gst_type_customer (Name) Werte ('noch nicht registriert')" existiert nicht

kommen
+0

Wie wäre es 'INSERT INTO xxx SELECT ... Werte eingefügt werden ... WHERE NICHT EXISTS (SELECT * FROM xxx WHERE ... Existenz Bedingung ...)'? –

+0

danke für die Antwort, –

+0

danke für die Antwort, ist es nicht wie der Code oben, der prüft, ob es existiert, wenn es nicht dann fügt es, dass Code-Schnipsel funktioniert gut, könnten Sie mir ein Beispiel geben, wenn ich verstehe nicht. –

Antwort

1

Der Fehler Sie erhalten durch doppelte Anführungszeichen verursacht wird, wenn die Funktion aufgerufen wird. Dies sollte funktionieren:

select merge_table(E'insert into gst_type_customer(name) values(\'Unregistered\')'::text) 

Sie müssen einfache Anführungszeichen verwenden, und die Flucht keine einfache Anführungszeichen in der ursprünglichen Abfrage-String (sind doppelte Anführungszeichen für Spaltennamen, einfache Anführungszeichen für Zeichenketten verwendet wird).

+0

Danke, dass das Problem behoben wurde –

1

Sie können INSERT ... SELECT wie folgt verwenden:

INSERT INTO gst_type_customer(create_date, write_date, create_uid, write_uid, name) 
SELECT (now() at time zone 'UTC'), (now() at time zone 'UTC'), 1, 1, 'Unregistered' 
WHERE NOT EXISTS (
    SELECT * 
    FROM gst_type_customer 
    WHERE name = 'Unregistered' 
) 
+0

das funktioniert für eine einzelne Abfrage, obwohl ich nicht für jede Abfrage implementieren kann, ist es möglich, das gleiche in einer gespeicherten Prozedur zu implementieren? –

1

Postgres 9.1 unterstützt fusionieren Befehl https://www.postgresql.org/message-id/attachment/23520/sql-merge.html

Beispiel:

MERGE CustomerAccount CA 

USING (SELECT CustomerId, Sum(TransactionValue) As TransactionSum 
     FROM Transactions 
     WHERE TransactionId > 35345678 
     GROUP BY CustomerId) AS T 

ON T.CustomerId = CA.CustomerId 

WHEN MATCHED 
    UPDATE SET Balance = Balance - TransactionSum 

WHEN NOT MATCHED 
    INSERT (CustomerId, Balance) 
    VALUES (T.CustomerId, T.TransactionSum) 
; 
Verwandte Themen