Gostaria de saber como verificar a integridade referencial em uma tabela depois de desabilitar e reabilitar as restrições de chave estrangeira.
Por exemplo :
postgres=# CREATE TABLE main(id serial, id_delta integer, PRIMARY KEY (id));
CREATE TABLE
postgres=# CREATE TABLE delta (id serial, PRIMARY KEY (id));
CREATE TABLE
postgres=# ALTER TABLE main ADD CONSTRAINT fk_main_delta FOREIGN KEY (id_delta) REFERENCES delta (id);
ALTER TABLE
Vamos tentar inserir um valor que não respeite fk_main_delta:
postgres=# INSERT INTO main (id_delta) VALUES (1);
ERROR: insert or update on table "main" violates foreign key constraint "fk_main_delta"
DÉTAIL : Key (id_delta)=(1) is not present in table "delta".
=> falha logicamente, então desativo as restrições FK para forçar a inserção:
postgres=# ALTER TABLE main DISABLE TRIGGER ALL;
postgres=# INSERT INTO main (id_delta) VALUES (1);
INSERT 0 1
postgres=# ALTER TABLE main ENABLE TRIGGER ALL;
Mas agora, a integridade referencial não é mais respeitada.
postgres=# SELECT * FROM main;
id | id_delta
----+----------
2 | 1
(1 ligne)
Então, há uma maneira de verificar a integridade depois?
Como parece que não há como verificar a integridade referencial depois de usar
DISABLE TRIGGER ALL
/ENABLE TRIGGER ALL
, finalmente useiDROP/CREATE CONSTRAINT
.Inspirado por esta postagem no blog de Magnus Hagander, usei essas consultas para gerar comandos alter para remover e criar FK:
Aqui está o meu processo:
usá
ALTER TABLE ... VALIDATE CONSTRAINT ...
-lo faz o que você quer.