Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从插入的行的“插入其他”返回值_Sql_Postgresql_Postgresql 9.5 - Fatal编程技术网

Sql 如何从插入的行的“插入其他”返回值

Sql 如何从插入的行的“插入其他”返回值,sql,postgresql,postgresql-9.5,Sql,Postgresql,Postgresql 9.5,我有很多行要同时插入到PostgreSQL数据库中。我需要跟踪为插入的每一行分配的id。例如,假设我们有表格: CREATE TABLE example ( id serial, name text, CONSTRAINT example_pkey PRIMARY KEY (id), ); 现在我有一些不想插入的id数据(因为serial id列将分配一个新id),但我需要跟踪旧id和新id之间的映射: old id | name ------------- -1 | fo

我有很多行要同时插入到PostgreSQL数据库中。我需要跟踪为插入的每一行分配的id。例如,假设我们有表格:

CREATE TABLE example
(
  id serial,
  name text,
  CONSTRAINT example_pkey PRIMARY KEY (id),
);
现在我有一些不想插入的id数据(因为serial id列将分配一个新id),但我需要跟踪旧id和新id之间的映射:

old id | name
-------------
-1     | foo
-2     | bar
-3     | baz
所以我写了这个查询

WITH data(oldid,name) AS ( VALUES
    (-1,'foo'),
    (-2,'bar'),
    (-3,'baz')
)
INSERT INTO example(name)
SELECT name FROM data d
RETURNING id, d.oldid
希望得到一些回报,比如:

id  | oldid
-----------
1   | -1
2   | -2
3   | -3
但是,这不起作用,因为我不相信您可以返回未插入的列。有没有其他方法可以做到这一点

 CREATE SEQUENCE data_id_seq;

 CREATE TABLE DATA (
      id integer default nextval('data_id_seq') NOT NULL PRIMARY KEY,
      oldid integer,
      name text,
 );

 INSERT INTO DATA(oldid,name) values (-1,'foo'),(-2,'bar'),(-3,'baz') returning id,oldid;
可选的RETURNING子句导致INSERT计算并返回 基于实际插入的每行的值

因此,对于这种解决方案,柱状寄生虫是不可避免的:

alter table example add column old bigint;

WITH d(oldid,name) AS ( VALUES
    (-1,'foo'),
    (-2,'bar'),
    (-3,'baz')
)
INSERT INTO example(name,old)
SELECT "name", oldid FROM d
RETURNING id, old

我最终创建了一个函数,该函数包装了插入一行:

CREATE OR REPLACE FUNCTION add_example(
    in_name text)
  RETURNS integer AS
$BODY$
DECLARE
 new_id integer;
BEGIN
    INSERT INTO example(name)
    VALUES (in_name) RETURNING id INTO new_id;
    RETURN new_id;
END;
$BODY$
LANGUAGE plpgsql;
然后我可以做:

WITH data(oldid, name) AS (VALUES
    (-1,'foo'),
    (-2,'bar'),
    (-3,'baz')
)
SELECT oldid, add_example(name) AS id
FROM data

这会回报我所期望的。我想看看这是否可以在没有函数的情况下完成。

我认为最简单的方法是将
oldid
列添加到
示例
表中我认为
返回
可以处理insert创建的行-因此我不能引用其他集合中的列我插入的表没有
oldid
列,是否可以在不更改表的情况下执行此操作?插入值时,将创建新行。如果要获取旧值,需要使用update语句或update和select的组合