我浏览了9.3 的文档,没有发现任何表明我可以或不能在SELECT
查询中使用来自查询的数据的信息BEGIN
。有可能还是我必须求助于某种WITH
查询?
我试图将两个查询合并到一个BEGIN
查询中,以找出在对数据库执行查询时如何更高效。我有另一个项目,这只兔子从我构建了一个快速复制表的工具的地方开始(这样我就可以测试我正在构建的其他数据库工具而不是原始工具)但是它不会复制主键。
第一个查询获取sequence
表的名称:
SELECT s.relname AS sequence
FROM pg_class AS s JOIN pg_depend d ON d.objid = s.oid
INNER JOIN pg_class AS t ON d.objid = s.oid AND d.refobjid = t.oid
INNER JOIN pg_attribute AS a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
INNER JOIN pg_namespace AS n ON n.oid = s.relnamespace
WHERE s.relkind = 'S'
AND n.nspname = 'public'
AND t.relname='parts';
第二个查询复制了一个表,尽管它已经包含sequence
从第一个查询中获取的名称:
BEGIN;
LOCK TABLE parts;
CREATE TABLE parts1 (LIKE parts INCLUDING ALL);
INSERT INTO parts1 SELECT * FROM parts;
SELECT setval('parts_id_seq1', (SELECT max(id) FROM parts)+1);
COMMIT;
您可能更适合在匿名块内执行整个操作
DO
......SQL小提琴