2016-05-12 7 views
0

ich diese Tabellen zum Speichern von Daten in PostgreSQLEinfügen von Daten in mehrere Tabellen mit einer SQL-Abfrage

CREATE TABLE SETTING 
    (`id` int, `description` varchar(16) 
    , `constrained` varchar(5), `data_type` varchar(12) 
    , `min_value` varchar(6) NULL , `max_value` varchar(6) NULL) 
; 

INSERT INTO SETTING 
    (`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`) 
VALUES 
    (10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL), 
    (11, 'Item Max Limit', 'false', 'integer', '0', '9001'), 
    (12, 'Item Min Limit', 'false', 'integer', '0', '9000') 
; 

CREATE TABLE ALLOWED_SETTING_VALUE 
    (`id` int, `setting_id` int, `item_value` varchar(7) 
    , `caption` varchar(6)) 
; 

INSERT INTO ALLOWED_SETTING_VALUE 
    (`id`, `setting_id`, `item_value`, `caption`) 
VALUES 
    (123, 10, '#0000FF', 'Blue'), 
    (124, 10, '#FFFF00', 'Yellow'), 
    (125, 10, '#FF00FF', 'Pink') 
; 

CREATE TABLE USER_SETTING 
    (`id` int, `user_id` int, `setting_id` int 
    , `allowed_setting_value_id` varchar(6) NULL 
    , `unconstrained_value` varchar(6) NULL) 
; 

INSERT INTO USER_SETTING 
    (`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`) 
VALUES 
    (5678, 234, 10, '124', NULL), 
    (7890, 234, 11, NULL, '100'), 
    (8901, 234, 12, NULL, '1') 
; 

Kann ich Daten in allen Tabellen einfügen verwenden möchten eine SQL-Abfrage verwenden? Zum Beispiel mehrere SQL-Insert-Anweisungen mit einer SQL-Abfrage?

Ist dies in PostgreSQL möglich?

+1

Mögliches Duplikat von [Einfügen von Daten in 3 Tabellen gleichzeitig mit Postgres] (http://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres) –

+0

Übrigens gibt es etwas Ähnliches in Oracle? –

+0

Oracle haben eine schöne saubere Syntax zum Einfügen von Daten in mehrere Tabellen: Beispiel: http://StackOverflow.com/Questions/21817181/oracle-multiTable-Insert-Syntax –

Antwort

1

Die Daten sind zu ungleich zu den Kaskadeneinfügungen, aber wenn sie regulärer waren (z. B. wenn Ihre Farben für jede Einstellung eins wären und nicht die drei für die gleiche Einstellung, obwohl für jede Einstellung eine Benutzereinstellung vorhanden ist) dann würde es mehr Sinn machen. Es kann jedoch geschehen, wie dies (obwohl es ziemlich albern ist):

CREATE temp TABLE SETTING (id int, description varchar(16), constrained varchar(5), data_type varchar(12), min_value varchar(6) NULL , max_value varchar(6) NULL); 
CREATE TABLE ALLOWED_SETTING_VALUE (id int, setting_id int, item_value varchar(7), caption varchar(6)); 
CREATE TABLE USER_SETTING (id int, user_id int, setting_id int, allowed_setting_value_id varchar(6) NULL, unconstrained_value varchar(6) NULL); 

-- the following is a single statement that inserts all 9 records 
with 
    allowed AS (
    INSERT INTO ALLOWED_SETTING_VALUE (id, setting_id, item_value, caption) 
    VALUES (123, 10, '#0000FF', 'Blue'), (124, 10, '#FFFF00', 'Yellow'), (125, 10, '#FF00FF', 'Pink') 
    RETURNING *), 
    data(id, description, constrained, data_type, min_value, max_value, us_id, user_id, allowed_setting_value_id, unconstrained_value) as (
    VALUES 
     (10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL, 5678, 234, (select id::text from allowed where caption = 'Yellow'), NULL), 
     (11, 'Item Max Limit', 'false', 'integer', '0', '9001', 7890, 234, NULL, '100'), 
     (12, 'Item Min Limit', 'false', 'integer', '0', '9000', 8901, 234, NULL, '1')), 
    settings as (
    INSERT INTO SETTING (id, description, constrained, data_type, min_value, max_value) 
    SELECT id, description, constrained, data_type, min_value, max_value 
    FROM data 
    RETURNING *) 
INSERT INTO USER_SETTING (id, user_id, setting_id, allowed_setting_value_id, unconstrained_value) 
SELECT d.us_id, d.user_id, s.id, d.allowed_setting_value_id, d.unconstrained_value 
FROM settings s 
JOIN data d ON (d.id = s.id); 

Ein Weg, läuft die ganze Sache zu haben, als ob es sich um eine einzige Aussage war es in einem DO-Befehl umschließt:

DO $do$ BEGIN 
    ... the whole script here ... 
END; $do$;