2016-05-23 9 views
1

LOGIC: Ich möchte loyalty_customers erstellen, wenn customers.user_id null ist und aktualisieren customers.user_id ist loyalty_customers.idUpdate von eingefügt ID

ich eine Abfrage haben und es funktioniert nicht:

UPDATE customers 
SET user_id = (
    INSERT INTO loyalty_users (name) VALUES ('anonymous')) RETURNING id 
) 
WHERE user_id IS NULL; 

Fehler wie:

LINE 3: INSERT INTO loyalty_users 

Sieht aus wie INSERT kann nicht von einer Abfrage umgebrochen werden, habe ich diese Abfrage versucht und es funktioniert immer noch nicht:

SELECT id FROM (
    INSERT INTO loyalty_users (name) VALUES ('anonymous')) RETURNING id); 

jedoch Stand-alone-INSERT-Abfrage arbeiten wie ein Zauber:

INSERT INTO loyalty_users (name) VALUES ('anonymous')) RETURNING id; 
+0

Es ist nicht ganz klar, was Ihre Logik ist, aber Sie könnten einen Trigger in Betracht ziehen, der nach 'UPDATE' ausgelöst wird. –

+0

Es ist ein Migrationsskript, so kann ich Trigger hier nicht verwenden –

+0

Möchten Sie eine einzelne anonyme einfügen (und fügen Sie es jeder Zeile, die 'user_id IS NULL ist), oder Sie möchten eine separate anonyme für jede 'user_id IS NULL 'Reihe? (In beiden Fällen ist die Verwendung von [CTEs] (http://www.postgresql.org/docs/current/static/queries-with.html) hier die einfachste Lösung, kann aber schwierig sein, wenn Sie für jede Zeile ein separates Anomynous wünschen). – pozs

Antwort

0

Kann der richtige Weg, dies zu tun ist:

WITH updated_customer AS (
    UPDATE customers 
    SET name = 'anonymous' 
    WHERE user_id IS NULL 
    RETURNING user_id AS id 
) 
INSERT INTO loyalty_users SELECT * FROM updated_customer; 

Es ist Arbeit für mich, aber Wenn Sie eine andere Idee haben, kommentieren Sie bitte diese Frage.

Verwandte Themen