如果 table 为空,如何在 pgsql table 中插入多行?
How to insert multiple rows in a pgsql table, if the table is empty?
我正在为 Blackboard 开发一个 Building Block,运行 遇到了一个与数据库相关的问题。
我正在尝试将四行插入到 pgsql table 中,但前提是 table 为空。查询 运行s 作为 post-schema 更新,因此每当我重新安装构建块时都是 运行。重要的是我不会简单地删除现有值 and/or 替换它们(否则这将是一个简单有效的解决方案)。
下面是我现有的查询,它可以完成工作,但仅适用于 one 行。正如我提到的,我正在尝试插入 four 行。我不能简单地 运行 多次插入,因为在第一个 运行 之后, table 将不再为空。
我们将不胜感激。
BEGIN;
INSERT INTO my_table_name
SELECT
nextval('my_table_name_SEQ'),
'Some website URL',
'Some image URL',
'Some website name',
'Y',
'Y'
WHERE
NOT EXISTS (
SELECT * FROM my_table_name
);
COMMIT;
END;
如果你计算行数会更好,因为它会得到输入行数。
这应该有效:
BEGIN;
INSERT INTO my_table_name
SELECT
nextval('my_table_name_SEQ'),
'Some website URL',
'Some image URL',
'Some website name',
'Y',
'Y'
WHERE
(SELECT COUNT(*) FROM my_table_name)>0
COMMIT;
END;
插入不会覆盖,所以我不理解你问题的那一部分。
以下是插入多行的两种方法;第二个示例是单个 sql 语句:
创建table 测试(col1 int,
列 2 变量(10)
);
insert into test select 1, 'A' ;
insert into test select 2, 'B' ;
insert into test (col1, col2)
values (3, 'C'),
(4, 'D'),
(5, 'E') ;
select * from test ;
1 "A"
2 "B"
3 "C"
4 "D"
5 "E"
我设法解决了这个问题。
在thispost中,@a_horse_with_no_name建议使用UNION ALL来解决类似的问题。
也感谢@Dan 建议使用 COUNT,而不是 EXISTS
我的最终查询:
BEGIN;
INSERT INTO my_table (pk1, coll1, coll2, coll3, coll4, coll5)
SELECT x.pk1, x.coll1, x.coll2, x.coll3, x.coll4, x.coll5
FROM (
SELECT
nextval('my_table_SEQ') as pk1,
'Some website URL' as coll1,
'Some image URL' as coll2,
'Some website name' as coll3,
'Y' as coll4,
'Y' as coll5
UNION
SELECT
nextval('my_table_SEQ'),
'Some other website URL',
'Some other image URL',
'Some other website name',
'Y',
'N'
UNION
SELECT
nextval('my_table_SEQ'),
'Some other other website URL',
'Some other other image URL',
'Some other other website name',
'Y',
'N'
UNION
SELECT
nextval('my_table_SEQ'),
'Some other other other website URL',
'Some other other other image URL',
'Some other other other website name',
'Y',
'Y'
) as x
WHERE
(SELECT COUNT(*) FROM my_table) <= 0;
COMMIT;
END;
我正在为 Blackboard 开发一个 Building Block,运行 遇到了一个与数据库相关的问题。
我正在尝试将四行插入到 pgsql table 中,但前提是 table 为空。查询 运行s 作为 post-schema 更新,因此每当我重新安装构建块时都是 运行。重要的是我不会简单地删除现有值 and/or 替换它们(否则这将是一个简单有效的解决方案)。
下面是我现有的查询,它可以完成工作,但仅适用于 one 行。正如我提到的,我正在尝试插入 four 行。我不能简单地 运行 多次插入,因为在第一个 运行 之后, table 将不再为空。
我们将不胜感激。
BEGIN;
INSERT INTO my_table_name
SELECT
nextval('my_table_name_SEQ'),
'Some website URL',
'Some image URL',
'Some website name',
'Y',
'Y'
WHERE
NOT EXISTS (
SELECT * FROM my_table_name
);
COMMIT;
END;
如果你计算行数会更好,因为它会得到输入行数。
这应该有效:
BEGIN;
INSERT INTO my_table_name
SELECT
nextval('my_table_name_SEQ'),
'Some website URL',
'Some image URL',
'Some website name',
'Y',
'Y'
WHERE
(SELECT COUNT(*) FROM my_table_name)>0
COMMIT;
END;
插入不会覆盖,所以我不理解你问题的那一部分。 以下是插入多行的两种方法;第二个示例是单个 sql 语句:
创建table 测试(col1 int, 列 2 变量(10) );
insert into test select 1, 'A' ;
insert into test select 2, 'B' ;
insert into test (col1, col2)
values (3, 'C'),
(4, 'D'),
(5, 'E') ;
select * from test ;
1 "A"
2 "B"
3 "C"
4 "D"
5 "E"
我设法解决了这个问题。 在thispost中,@a_horse_with_no_name建议使用UNION ALL来解决类似的问题。
也感谢@Dan 建议使用 COUNT,而不是 EXISTS
我的最终查询:
BEGIN;
INSERT INTO my_table (pk1, coll1, coll2, coll3, coll4, coll5)
SELECT x.pk1, x.coll1, x.coll2, x.coll3, x.coll4, x.coll5
FROM (
SELECT
nextval('my_table_SEQ') as pk1,
'Some website URL' as coll1,
'Some image URL' as coll2,
'Some website name' as coll3,
'Y' as coll4,
'Y' as coll5
UNION
SELECT
nextval('my_table_SEQ'),
'Some other website URL',
'Some other image URL',
'Some other website name',
'Y',
'N'
UNION
SELECT
nextval('my_table_SEQ'),
'Some other other website URL',
'Some other other image URL',
'Some other other website name',
'Y',
'N'
UNION
SELECT
nextval('my_table_SEQ'),
'Some other other other website URL',
'Some other other other image URL',
'Some other other other website name',
'Y',
'Y'
) as x
WHERE
(SELECT COUNT(*) FROM my_table) <= 0;
COMMIT;
END;