可以在 Postgres 8.4 中嵌套插入吗?

Joh*_*ohn 6 postgresql insert

我正在尝试将数据导入库存类型数据库。这是我的表格(为简洁起见被截断):

创建类型主机为 enum ('Physical', 'Virtual', 'Hypervisor', 'Other');

创建表主机(
  id 串行主键,
  主机名 varchar(40),
  角色hostrole
);

创建表接口(
  id 串行主键,
  名称 varchar(20),
  主机 int 在删除级联上引用主机(id),
  mac macaddr
);

我知道我可以将 a 嵌套select到一个insert语句中,我的问题是我是否可以insert将 an嵌套到 an 中insert(如果可以,该怎么做)。这是我试图运行的语句:

插入界面 
  (姓名, 
   苹果电脑, 
   主持人) 
     价值观 
  ('eth0', 
   '00:50:56:9d:34:d4', 
   (插入主机(主机名,主机角色)值('foobar','Virtual')返回 id)
);

错误出现在嵌套插入的“进入”处。我可以一次性完成此操作,还是必须进行单独的查询才能执行此插入操作?

小智 9

您应该能够使用可写 CTE 执行以下操作:

WITH i AS (
   INSERT INTO host (hostname, hostrole) VALUES ('foobar', 'Virtual') RETURNING id
)
INSERT INTO interface (name, mac, host)
SELECT 'eth0', '00:50:56:9d:34:d4', id
FROM i
Run Code Online (Sandbox Code Playgroud)

(未经测试,但应该是这样的)

可写 CTE 在 PostgreSQL 9.1 及更高版本中。

  • 也没有理由使用 9.1,因为 9.2 更新、更好、更稳定……顺便说一句,如果您不能使用存储库,请通过源代码安装它,这真的很容易…… (2认同)

Chr*_*ers 5

在 8.4 中,您可以通过将内部插入内容包装在一个函数中来做到这一点。就像是:

CREATE OR REPLACE FUNCTION insert_host(in_hostname text, in_hostrole text)
RETURNS INT LANGUAGE SQL AS
$$
   INSERT INTO host (hostname, hostrole) VALUES ($1, $2);
   SELECT id FROM host WHERE hostname = $1;
$$;
Run Code Online (Sandbox Code Playgroud)

然后您仍然可以执行以下操作:

insert into interface 
(name, mac, host) 
 values 
('eth0', '00:50:56:9d:34:d4', insert_host('foobar', 'Virtual'));
Run Code Online (Sandbox Code Playgroud)