2013-02-17 19 views
13

Z postgresql documentation:Różnica ograniczenia i BEZ DZIAŁANIA

OGRANICZAĆ uniemożliwia usunięcie Wskazana rzędu. BRAK ACTION oznacza, że ​​jeśli wiersze odwołania istnieją po sprawdzeniu ograniczenia, zostanie zgłoszony błąd; jest to domyślne zachowanie, jeśli nic nie określasz. (Zasadnicza różnica między tymi dwoma wyborów jest, że żadne działanie umożliwia sprawdzenie być odroczone do czasu później w transakcji, natomiast OGRANICZAJă nie.)

Pozwala to sprawdzić. Tworzenie rodzica i stół dziecko:

CREATE TABLE parent (
    id serial not null, 
    CONSTRAINT parent_pkey PRIMARY KEY (id) 
); 

CREATE TABLE child (
    id serial not null, 
    parent_id serial not null, 
    CONSTRAINT child_pkey PRIMARY KEY (id), 
    CONSTRAINT parent_fk FOREIGN KEY (parent_id) 
    REFERENCES parent (id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
); 

Wypełnianie niektóre dane:

insert into parent values(1); 
insert into child values(5, 1); 

i przetestować robi wyboru jest naprawdę odroczonego:

BEGIN; 
delete from parent where id = 1; -- violates foreign key constraint, execution fails 
delete from child where parent_id = 1; 
COMMIT; 

Po najpierw usunąć integralności został uszkodzony, ale po drugie zostanie przywrócona. Jednak wykonanie nie powiedzie się przy pierwszym usunięciu.

samo dla aktualizacji:

BEGIN; 
update parent set id = 2 where id = 1; -- same as above 
update child set parent_id = 2 where parent_id = 1; 
COMMIT; 

W przypadku usuwaniem Czy mogę zamienić oświadczenia, aby pracować, ale w przypadku aktualizacji nie mogę wykonywać je (jest achivable poprzez usunięcie zarówno wiersze i wstawienie nowe wersje).

Wiele baz danych nie robi żadnej różnicy między RESTRICT i BEZ AKCJI, podczas gdy postgres udaje, że robi inaczej. Czy to (nadal) jest prawdą?

Odpowiedz

14

Różnica pojawia się tylko wtedy, gdy zdefiniujesz ograniczenie jako DEFERRABLE w trybie INITIALLY DEFERRED lub INITIALLY IMMEDIATE.

Zobacz .

Powiązane problemy