mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Implement ALTER TABLE .. SET LOGGED / UNLOGGED
This enables changing permanent (logged) tables to unlogged and vice-versa. (Docs for ALTER TABLE / SET TABLESPACE got shuffled in an order that hopefully makes more sense than the original.) Author: Fabrízio de Royes Mello Reviewed by: Christoph Berg, Andres Freund, Thom Brown Some tweaking by Álvaro Herrera
This commit is contained in:
@ -1624,3 +1624,55 @@ TRUNCATE old_system_table;
|
||||
ALTER TABLE old_system_table DROP CONSTRAINT new_system_table_pkey;
|
||||
ALTER TABLE old_system_table DROP COLUMN othercol;
|
||||
DROP TABLE old_system_table;
|
||||
|
||||
-- set logged
|
||||
CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT);
|
||||
-- check relpersistence of an unlogged table
|
||||
SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1'
|
||||
UNION ALL
|
||||
SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1'
|
||||
UNION ALL
|
||||
SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1'
|
||||
ORDER BY relname;
|
||||
CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key
|
||||
CREATE UNLOGGED TABLE unlogged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged3); -- self-referencing foreign key
|
||||
ALTER TABLE unlogged3 SET LOGGED; -- skip self-referencing foreign key
|
||||
ALTER TABLE unlogged2 SET LOGGED; -- fails because a foreign key to an unlogged table exists
|
||||
ALTER TABLE unlogged1 SET LOGGED;
|
||||
-- check relpersistence of an unlogged table after changing to permament
|
||||
SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1'
|
||||
UNION ALL
|
||||
SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1'
|
||||
UNION ALL
|
||||
SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1'
|
||||
ORDER BY relname;
|
||||
ALTER TABLE unlogged1 SET LOGGED; -- silently do nothing
|
||||
DROP TABLE unlogged3;
|
||||
DROP TABLE unlogged2;
|
||||
DROP TABLE unlogged1;
|
||||
-- set unlogged
|
||||
CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT);
|
||||
-- check relpersistence of a permanent table
|
||||
SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1'
|
||||
UNION ALL
|
||||
SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1'
|
||||
UNION ALL
|
||||
SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1'
|
||||
ORDER BY relname;
|
||||
CREATE TABLE logged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged1); -- foreign key
|
||||
CREATE TABLE logged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged3); -- self-referencing foreign key
|
||||
ALTER TABLE logged1 SET UNLOGGED; -- fails because a foreign key from a permanent table exists
|
||||
ALTER TABLE logged3 SET UNLOGGED; -- skip self-referencing foreign key
|
||||
ALTER TABLE logged2 SET UNLOGGED;
|
||||
ALTER TABLE logged1 SET UNLOGGED;
|
||||
-- check relpersistence of a permanent table after changing to unlogged
|
||||
SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1'
|
||||
UNION ALL
|
||||
SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1'
|
||||
UNION ALL
|
||||
SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1'
|
||||
ORDER BY relname;
|
||||
ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing
|
||||
DROP TABLE logged3;
|
||||
DROP TABLE logged2;
|
||||
DROP TABLE logged1;
|
||||
|
Reference in New Issue
Block a user