CREATE SEQUENCE test_seq; CREATE TABLE test ( id integer DEFAULT nextval('test_seq') CHECK(id > 0) PRIMARY KEY, parent integer CHECK((id = 1 AND parent IS NULL) OR (id <> 1 AND parent IS NOT NULL)) REFERENCES test(id) ON DELETE CASCADE, data text NOT NULL ) WITHOUT OIDS; INSERT INTO test VALUES(DEFAULT, NULL, 'root'); -- every tree has to have a root! (c) Joe Celko CREATE TRIGGER test_insert BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE tree_insert(); CREATE TRIGGER test_delete BEFORE DELETE ON test FOR EACH ROW EXECUTE PROCEDURE tree_delete(); CREATE TABLE test_tree ( id integer NOT NULL REFERENCES test(id) ON DELETE CASCADE, node integer[2] NOT NULL, kids integer NOT NULL CHECK(kids >= 0), CONSTRAINT id_unique UNIQUE(id) ) WITHOUT OIDS; INSERT INTO test_tree VALUES(1, ARRAY[3,2], 0);