From: | chris(at)chrullrich(dot)net |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #13224: Foreign key constraints cannot be changed to deferrable |
Date: | 2015-05-03 08:33:43 |
Message-ID: | 20150503083343.2662.37021@wrigleys.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged on the website:
Bug reference: 13224
Logged by: Christian Ullrich
Email address: chris(at)chrullrich(dot)net
PostgreSQL version: 9.4.1
Operating system: Windows
Description:
According to the manual, ALTER TABLE ... ALTER CONSTRAINT ... DEFERRABLE
should work. It does not, according to the script below.
-- Demonstrates bug related to FK constraints ALTERed to DEFERRABLE.
CREATE TABLE master (
id INTEGER PRIMARY KEY
);
CREATE TABLE detail (
id_master INTEGER REFERENCES master (id),
val TEXT,
PRIMARY KEY (id_master)
);
-- Show the constraint.
SELECT * FROM pg_constraint WHERE conname = 'detail_id_master_fkey';
INSERT INTO master VALUES (1);
INSERT INTO detail VALUES (1, 'one');
-- Fail to change the primary key on the master table (expected).
BEGIN;
UPDATE master SET id = 2 WHERE id = 1;
ROLLBACK;
-- Make the constraint deferrable.
ALTER TABLE detail ALTER CONSTRAINT detail_id_master_fkey DEFERRABLE
INITIALLY IMMEDIATE;
-- Show the constraint. Note condeferrable = true.
SELECT * FROM pg_constraint WHERE conname = 'detail_id_master_fkey';
-- Fail again (unexpected).
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
UPDATE master SET id = 2 WHERE id = 1;
ROLLBACK;
-- Recreate the constraint as deferrable.
ALTER TABLE detail DROP CONSTRAINT detail_id_master_fkey;
ALTER TABLE detail ADD CONSTRAINT detail_id_master_fkey FOREIGN KEY
(id_master) REFERENCES master (id) DEFERRABLE INITIALLY IMMEDIATE;
-- Show the constraint. Note the record is identical to the one from
-- the previous query.
SELECT * FROM pg_constraint WHERE conname = 'detail_id_master_fkey';
-- Succeed this time (expected).
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
UPDATE master SET id = 2 WHERE id = 1;
UPDATE detail SET id_master = 2 WHERE id_master = 1;
COMMIT;
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2015-05-03 14:16:58 | Re: BUG #13224: Foreign key constraints cannot be changed to deferrable |
Previous Message | Amit Kapila | 2015-05-03 04:40:29 | Re: Re: BUG #12990: Missing pg_multixact/members files (appears to have wrapped, then truncated) |