-- Test basic TRUNCATE functionality. CREATETABLE truncate_a (col1 integerprimarykey); INSERTINTO truncate_a VALUES (1); INSERTINTO truncate_a VALUES (2); SELECT * FROM truncate_a; -- Roll truncate back
BEGIN;
TRUNCATE truncate_a;
ROLLBACK; SELECT * FROM truncate_a; -- Commit the truncate this time
BEGIN;
TRUNCATE truncate_a; COMMIT; SELECT * FROM truncate_a;
-- Test foreign-key checks CREATETABLE trunc_b (a intREFERENCES truncate_a); CREATETABLE trunc_c (a serial PRIMARYKEY); CREATETABLE trunc_d (a intREFERENCES trunc_c); CREATETABLE trunc_e (a intREFERENCES truncate_a, b intREFERENCES trunc_c);
-- Add some data to verify that truncating actually works ... INSERTINTO trunc_c VALUES (1); INSERTINTO truncate_a VALUES (1); INSERTINTO trunc_b VALUES (1); INSERTINTO trunc_d VALUES (1); INSERTINTO trunc_e VALUES (1,1);
TRUNCATE TABLE trunc_c;
TRUNCATE TABLE trunc_c,truncate_a;
TRUNCATE TABLE trunc_c,truncate_a,trunc_d;
TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e;
TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b;
-- Verify that truncating did actually work SELECT * FROM truncate_a UNIONALL SELECT * FROM trunc_c UNIONALL SELECT * FROM trunc_b UNIONALL SELECT * FROM trunc_d; SELECT * FROM trunc_e;
-- Add data again to test TRUNCATE ... CASCADE INSERTINTO trunc_c VALUES (1); INSERTINTO truncate_a VALUES (1); INSERTINTO trunc_b VALUES (1); INSERTINTO trunc_d VALUES (1); INSERTINTO trunc_e VALUES (1,1);
TRUNCATE TABLE trunc_c CASCADE; -- ok
SELECT * FROM truncate_a UNIONALL SELECT * FROM trunc_c UNIONALL SELECT * FROM trunc_b UNIONALL SELECT * FROM trunc_d; SELECT * FROM trunc_e;
BEGIN; SELECT * FROM trunc_f;
TRUNCATE trunc_f; SELECT * FROM trunc_f;
ROLLBACK;
BEGIN; SELECT * FROM trunc_f;
TRUNCATE ONLY trunc_f; SELECT * FROM trunc_f;
ROLLBACK;
BEGIN; SELECT * FROM trunc_f; SELECT * FROM trunc_fa; SELECT * FROM trunc_faa;
TRUNCATE ONLY trunc_fb, ONLY trunc_fa; SELECT * FROM trunc_f; SELECT * FROM trunc_fa; SELECT * FROM trunc_faa;
ROLLBACK;
BEGIN; SELECT * FROM trunc_f; SELECT * FROM trunc_fa; SELECT * FROM trunc_faa;
TRUNCATE ONLY trunc_fb, trunc_fa; SELECT * FROM trunc_f; SELECT * FROM trunc_fa; SELECT * FROM trunc_faa;
ROLLBACK;
CREATETRIGGER t BEFORE TRUNCATE ON trunc_trigger_test FOREACH STATEMENT
EXECUTE PROCEDURE trunctrigger('before trigger truncate');
SELECT count(*) as"Row count in test table"FROM trunc_trigger_test; SELECT * FROM trunc_trigger_log;
TRUNCATE trunc_trigger_test; SELECT count(*) as"Row count in test table"FROM trunc_trigger_test; SELECT * FROM trunc_trigger_log;
DROPTRIGGER t ON trunc_trigger_test;
truncate trunc_trigger_log;
-- same test with an after trigger INSERTINTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux');
CREATETRIGGER tt
AFTER TRUNCATE ON trunc_trigger_test FOREACH STATEMENT
EXECUTE PROCEDURE trunctrigger('after trigger truncate');
SELECT count(*) as"Row count in test table"FROM trunc_trigger_test; SELECT * FROM trunc_trigger_log;
TRUNCATE trunc_trigger_test; SELECT count(*) as"Row count in test table"FROM trunc_trigger_test; SELECT * FROM trunc_trigger_log;
-- test TRUNCATE ... RESTART IDENTITY CREATE SEQUENCE truncate_a_id1 START WITH33; CREATETABLE truncate_a (id serial,
id1 integerdefault nextval('truncate_a_id1')); ALTER SEQUENCE truncate_a_id1 OWNED BY truncate_a.id1;
INSERTINTO truncate_a DEFAULTVALUES; INSERTINTO truncate_a DEFAULTVALUES; SELECT * FROM truncate_a;
TRUNCATE truncate_a;
INSERTINTO truncate_a DEFAULTVALUES; INSERTINTO truncate_a DEFAULTVALUES; SELECT * FROM truncate_a;
TRUNCATE truncate_a RESTART IDENTITY;
INSERTINTO truncate_a DEFAULTVALUES; INSERTINTO truncate_a DEFAULTVALUES; SELECT * FROM truncate_a;
CREATETABLE truncate_b (id int GENERATED ALWAYS AS IDENTITY (START WITH44));
INSERTINTO truncate_b DEFAULTVALUES; INSERTINTO truncate_b DEFAULTVALUES; SELECT * FROM truncate_b;
TRUNCATE truncate_b;
INSERTINTO truncate_b DEFAULTVALUES; INSERTINTO truncate_b DEFAULTVALUES; SELECT * FROM truncate_b;
TRUNCATE truncate_b RESTART IDENTITY;
INSERTINTO truncate_b DEFAULTVALUES; INSERTINTO truncate_b DEFAULTVALUES; SELECT * FROM truncate_b;
-- check rollback of a RESTART IDENTITY operation
BEGIN;
TRUNCATE truncate_a RESTART IDENTITY; INSERTINTO truncate_a DEFAULTVALUES; SELECT * FROM truncate_a;
ROLLBACK; INSERTINTO truncate_a DEFAULTVALUES; INSERTINTO truncate_a DEFAULTVALUES; SELECT * FROM truncate_a;
DROPTABLE truncate_a;
SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
-- partitioned table CREATETABLE truncparted (a int, b char) PARTITION BY LIST (a); -- error, can't truncate a partitioned table
TRUNCATE ONLY truncparted; CREATETABLE truncparted1 PARTITION OF truncparted FORVALUESIN (1); INSERTINTO truncparted VALUES (1, 'a'); -- error, must truncate partitions
TRUNCATE ONLY truncparted;
TRUNCATE truncparted; DROPTABLE truncparted;
-- foreign key on partitioned table: partition key is referencing column. -- Make sure truncate did execute on all tables CREATE FUNCTION tp_ins_data() RETURNS void LANGUAGE plpgsql AS $$
BEGIN INSERTINTO truncprim VALUES (1), (100), (150); INSERTINTO truncpart VALUES (1), (100), (150);
END
$$; CREATE FUNCTION tp_chk_data(OUT pktb regclass, OUT pkval int, OUT fktb regclass, OUT fkval int)
RETURNS SETOF record LANGUAGE plpgsql AS $$
BEGIN RETURN QUERY SELECT
pk.tableoid::regclass, pk.a, fk.tableoid::regclass, fk.a FROM truncprim pk FULL JOIN truncpart fk USING (a) ORDERBY2, 4;
END
$$; CREATETABLE truncprim (a intPRIMARYKEY); CREATETABLE truncpart (a intREFERENCES truncprim)
PARTITION BY RANGE (a); CREATETABLE truncpart_1 PARTITION OF truncpart FORVALUESFROM (0) TO (100); CREATETABLE truncpart_2 PARTITION OF truncpart FORVALUESFROM (100) TO (200)
PARTITION BY RANGE (a); CREATETABLE truncpart_2_1 PARTITION OF truncpart_2 FORVALUESFROM (100) TO (150); CREATETABLE truncpart_2_d PARTITION OF truncpart_2 DEFAULT;
TRUNCATE TABLE truncprim; -- should fail
select tp_ins_data(); -- should truncate everything
TRUNCATE TABLE truncprim, truncpart; select * from tp_chk_data();
select tp_ins_data(); -- should truncate everything
TRUNCATE TABLE truncprim CASCADE; SELECT * FROM tp_chk_data();
SELECT tp_ins_data(); -- should truncate all partitions
TRUNCATE TABLE truncpart; SELECT * FROM tp_chk_data(); DROPTABLE truncprim, truncpart; DROP FUNCTION tp_ins_data(), tp_chk_data();
-- test cascade when referencing a partitioned table CREATETABLE trunc_a (a INTPRIMARYKEY) PARTITION BY RANGE (a); CREATETABLE trunc_a1 PARTITION OF trunc_a FORVALUESFROM (0) TO (10); CREATETABLE trunc_a2 PARTITION OF trunc_a FORVALUESFROM (10) TO (20)
PARTITION BY RANGE (a); CREATETABLE trunc_a21 PARTITION OF trunc_a2 FORVALUESFROM (10) TO (12); CREATETABLE trunc_a22 PARTITION OF trunc_a2 FORVALUESFROM (12) TO (16); CREATETABLE trunc_a2d PARTITION OF trunc_a2 DEFAULT; CREATETABLE trunc_a3 PARTITION OF trunc_a FORVALUESFROM (20) TO (30); INSERTINTO trunc_a VALUES (0), (5), (10), (15), (20), (25);
-- truncate a partition cascading to a table CREATETABLE ref_b (
b INTPRIMARYKEY,
a INTREFERENCES trunc_a(a) ONDELETECASCADE
); INSERTINTO ref_b VALUES (10, 0), (50, 5), (100, 10), (150, 15);
TRUNCATE TABLE trunc_a1 CASCADE; SELECT a FROM ref_b;
DROPTABLE ref_b;
-- truncate a partition cascading to a partitioned table CREATETABLE ref_c (
c INTPRIMARYKEY,
a INTREFERENCES trunc_a(a) ONDELETECASCADE
) PARTITION BY RANGE (c); CREATETABLE ref_c1 PARTITION OF ref_c FORVALUESFROM (100) TO (200); CREATETABLE ref_c2 PARTITION OF ref_c FORVALUESFROM (200) TO (300); INSERTINTO ref_c VALUES (100, 10), (150, 15), (200, 20), (250, 25);
TRUNCATE TABLE trunc_a21 CASCADE; SELECT a as"from table ref_c"FROM ref_c; SELECT a as"from table trunc_a"FROM trunc_a ORDERBY a;
DROPTABLE trunc_a, ref_c;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.