Postgresql PGSQL插入到要插入到B的get ID中
表A是我所有表的唯一序列Postgresql PGSQL插入到要插入到B的get ID中,postgresql,triggers,insert,sequence,Postgresql,Triggers,Insert,Sequence,表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",
-- 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表名作为标记传递。您需要的是:
。。。这将在插入后为您提供ID序列的当前值。为了安全起见,最好在事务中使用它,尤其是将它与负载平衡结合使用时:
BEGIN;
INSERT INTO "a" ...
INSERT INTO "b" VALUES ( CURRVAL('IdCentral_Id_seq', ... )
COMMIT;
也就是说,您似乎正在为数据库实现一个“通用ID”系统。这是每个新DBA都尝试过的(我尝试过),而且这不可避免地是一个坏主意,你最终会花很多时间来重构。如果你真的需要某种通用的ID,考虑使用UUID代替。
BEGIN;
INSERT INTO "a" ...
INSERT INTO "b" VALUES ( CURRVAL('IdCentral_Id_seq', ... )
COMMIT;