Eu examinei a documentação do 9.3 e não encontrei nada que sugerisse que eu posso ou não usar dados de uma SELECT
consulta dentro de uma BEGIN
consulta. É possível ou terei que recorrer a WITH
algum tipo de consulta?
Estou tentando mesclar duas consultas em uma única BEGIN
consulta para descobrir como ser mais eficiente ao executar consultas ao banco de dados. Eu tenho outro projeto que este coelho rastreia de onde eu construí uma ferramenta que duplica rapidamente uma tabela (para que eu possa testar outras ferramentas de banco de dados que estou construindo em vez dos originais), no entanto, ela não replica a chave primária.
Esta primeira consulta busca o sequence
nome de uma tabela:
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';
Esta segunda consulta duplica uma tabela, embora já contenha o sequence
nome obtido na primeira consulta:
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;
Você provavelmente seria mais adequado para fazer toda a operação dentro de um bloco anônimo..
DO
..SQL Fiddle