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ą?