2017-07-17 78 views
1

表A是我所有表的一種獨特序列。PGSQL插入到獲取ID插入到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; 

表B是我的數據庫

-- 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; 

的任何表時,我要插入到B,我需要在通過在B表名作爲標籤來創建一個新的記錄。

回答

1

你想要的是CURRVAL

SELECT CURRVAL('IdCentral_Id_seq'); 

...它會給你插入後的ID序列中的當前值。爲了安全起見,最好使用它在事務中,特別是如果你將其與負載均衡相結合:

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

話雖這麼說,看來你是爲實現「通用ID」系統的數據庫。這是每個新的DBA嘗試(我做過)的事情,並且這最終會花費大量的時間重構出來,這是不可避免的。如果出於某種原因您確實需要某種通用ID,請考慮使用UUID。