英文:
How to specify native table fields and a foreign table field during an insert?
问题
以下是要翻译的内容:
Suppose the following:
create table member (
id serial primary key,
member_name varchar(55),
role_ids bigint[] not null
);
create table role (
id serial primary key,
role_name varchar(55) unique
);
insert into role values (1, 'admin'), (2, 'common');
I can create an admin member
like this:
insert into member (role_ids)
select ARRAY[id] as role_id from role where role_name = 'admin';
But how can I specify other fields, like member_name
as well?
I've tried this:
insert into member (member_name, role_ids) values('test member', role_ids)
select ARRAY[id::bigint] as role_id from role where role_name = 'admin';
But this throws an error, error at or near select
.
英文:
Suppose the following:
create table member (
id serial primary key,
member_name varchar(55),
role_ids bigint[] not null
);
create table role (
id serial primary key,
role_name varchar(55) unique
);
insert into role values (1, 'admin'), (2, 'common');
I can create an admin member
like this:
insert into member (role_ids)
select ARRAY[id] as role_id from role where role_name = 'admin';
But how can I specify other fields, like member_name
as well?
I've tried this:
insert into member (member_name, role_ids) values('test member', role_ids)
select ARRAY[id::bigint] as role_id from role where role_name = 'admin';
But this throws an error, error at or near select
答案1
得分: 1
在你的情况下,我可能会选择在 VALUES
内部使用嵌套的 SELECT
,以强调这是一个期望成功并返回一个值的查找操作:
insert into member (member_name, role_ids)
values('test member',
(select ARRAY[id] from role where role_name = 'admin'));
如果你在选择中选择多个列,这种方法就不起作用。另一种解决方案是只使用 SELECT
而不使用 VALUES
,因为在你的 SELECT
中返回文字值是没有问题的。你不需要为插入中的选择命名列,而是按照插入中列的顺序进行排序:
insert into member (member_name, role_ids)
select 'test member', ARRAY[id] from role where role_name = 'admin';
英文:
In your case I would probably choose to use a nested SELECT
inside the VALUES
, to emphasize that this is a lookup that you expect to succeed and return only one value:
insert into member (member_name, role_ids)
values('test member',
(select ARRAY[id] from role where role_name = 'admin'));
This wouldn't work if you were selecting more than one column in your select. Another solution would be to just use SELECT
and no VALUES
, because nothing stops you from returning literal values in your SELECT
. You don't name the columns in the select for your insert, instead you order them to match the order of the columns in the insert:
insert into member (member_name, role_ids)
select 'test member', ARRAY[id] from role where role_name = 'admin';
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论