我正在尝试将数据导入库存类型数据库。这是我的表格(为简洁起见被截断):
创建类型主机为 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 次 |
最近记录: |