2017-07-17 80 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。