我正在尝试将数据导入库存类型数据库。这是我的表格(为简洁起见被截断):
创建类型主机为 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 及更高版本中。
在 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)
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |