bug with constraint dependencies? or bug with pg_dump/pg_restore?
От | Gregory Stark |
---|---|
Тема | bug with constraint dependencies? or bug with pg_dump/pg_restore? |
Дата | |
Msg-id | 87r835lro1.fsf@stark.dyndns.tv обсуждение исходный текст |
Ответы |
Re: bug with constraint dependencies? or bug with
|
Список | pgsql-hackers |
It seems when you create a new table with the "references" syntax the constraint is created with a dependency specifically on a "primary key" constraint on the target table. However when you alter a table to add a foreign key constraint the constraint is added with a dependency on any unique index on the column -- not necessarily a primary key constraint. This causes problems with pg_dump/pg_restore. I'm having trouble restoring my database now for a 7.4 beta test because I get errors like: pg_restore: [archiver (db)] could not execute query: ERROR: there is no UNIQUE constraint matching given keys for referencedtable "region" pg_restore: *** aborted because of error In fact there is a unique index, but the indexes aren't created by pg_restore until later in the process. test=> create table test (a integer); CREATE TABLE test=> create unique index test_idx on test (a); CREATE INDEX test=> alter table test add constraint test_pkey primary key (a); ERROR: Existing attribute "a" cannot be a PRIMARY KEY because it is not marked NOT NULL test=> alter table test alter a set not null; ALTER TABLE test=> alter table test add constraint test_pkey primary key (a); NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index 'test_pkey' for table 'test' ALTER TABLE test=> create table test2 (a integer references test); NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s) CREATE TABLE test=> alter table test drop constraint test_pkey; NOTICE: constraint $1 on table test2 depends on index test_pkey ERROR: Cannot drop constraint test_pkey on table test because other objects depend on itUse DROP ... CASCADE to drop thedependent objects too test=> drop table test2; DROP TABLE test=> create table test2 (a integer); CREATE TABLE test=> alter table test2 add constraint test2fk foreign key (a) references foo(a); NOTICE: ALTER TABLE will create implicit trigger(s) for FOREIGN KEY check(s) ALTER TABLE test=> alter table test drop constraint test_pkey; ALTER TABLE -- greg
В списке pgsql-hackers по дате отправления: