BUG #13224: Foreign key constraints cannot be changed to deferrable

Поиск
Список
Период
Сортировка
От chris@chrullrich.net
Тема BUG #13224: Foreign key constraints cannot be changed to deferrable
Дата
Msg-id 20150503083343.2662.37021@wrigleys.postgresql.org
обсуждение исходный текст
Ответы Re: BUG #13224: Foreign key constraints cannot be changed to deferrable  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
The following bug has been logged on the website:

Bug reference:      13224
Logged by:          Christian Ullrich
Email address:      chris@chrullrich.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;

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Amit Kapila
Дата:
Сообщение: Re: Re: BUG #12990: Missing pg_multixact/members files (appears to have wrapped, then truncated)
Следующее
От: Tom Lane
Дата:
Сообщение: Re: BUG #13224: Foreign key constraints cannot be changed to deferrable