2017-07-17 6 views
1

Tabelle A ist eine Art eindeutige Sequenz für alle meine Tabellen.PGSQL Einfügen in A get ID zum Einfügen in B

-- Table: public."IdCentral" 

-- DROP TABLE public."IdCentral"; 

CREATE TABLE public."IdCentral" 
(
    "Id" bigint NOT NULL DEFAULT nextval('"IdCentral_Id_seq"'::regclass), 
    "Tag" character varying(127) COLLATE pg_catalog."default", 
    CONSTRAINT "IdCentral_pkey" PRIMARY KEY ("Id") 
) 
WITH (
    OIDS = FALSE 
) 
TABLESPACE pg_default; 

Tabelle B jede Tabelle meiner Datenbank ist

-- Table: public."Users" 

-- DROP TABLE public."Users"; 

CREATE TABLE public."Users" 
(
    "Id" bigint NOT NULL, 
    "Login" character varying(30) COLLATE pg_catalog."default" NOT NULL, 
    CONSTRAINT "Users_pkey" PRIMARY KEY ("Id"), 
    CONSTRAINT "PK" FOREIGN KEY ("Id") 
     REFERENCES public."IdCentral" ("Id") MATCH FULL 
     ON UPDATE NO ACTION 
     ON DELETE NO ACTION 
) 
WITH (
    OIDS = FALSE 
) 
TABLESPACE pg_default; 

ALTER TABLE public."Users" 
    OWNER to dba; 

Wenn ich in B eingefügt werden soll, brauche ich einen neuen Rekord in A Passieren des B Tabellennamen als Tag zu erstellen.

Antwort

1

Was Sie wollen, ist CURRVAL:

SELECT CURRVAL('IdCentral_Id_seq'); 

... die Sie den aktuellen Wert für die ID-Sequenz nach Einsatz geben. Aus Sicherheitsgründen ist es am besten, es in einer Transaktion zu verwenden, besonders wenn man es mit Load-Balancing ist kombiniert:

BEGIN; 
INSERT INTO "a" ... 
INSERT INTO "b" VALUES (CURRVAL('IdCentral_Id_seq', ...) 
COMMIT; 

Dass gesagt wird, scheint es, dass Sie eine „Universal-ID“ -System sind die Umsetzung für Ihre Datenbank. Das ist etwas, was jeder neue DBA versucht (ich tat es), und es ist unvermeidlich eine schlechte Idee, die Sie am Ende viel Zeit damit verbringen, später zu refactoring. Wenn Sie aus irgendeinem Grund eine universelle ID benötigen, sollten Sie stattdessen eine UUID verwenden.

Verwandte Themen