表A是我所有表格的一种独特序列。
-- 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时,我需要在A中创建一个新记录,将B表名称作为标记传递。
答案 0 :(得分: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。