PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden Sie Trigger für geerbte Tabellen, um Fremdschlüssel zu ersetzen

Entfernen Sie zuerst den FK mit etwas in der Art:

alter table address drop constraint address_person_id_fkey

Wenn sich das darüber beschwert, dass es keinen address_person_id_fkey gibt verwenden Sie dann \d address; in psql um herauszufinden, wie der FK heißt.

Dann sollte ein einfacher Trigger wie dieser ausreichen:

create or replace function pseudo_fk_for_address() returns trigger as $$
begin
    if not exists(select 1 from person where id = new.person_id) then
        raise exception 'No such person: %', new.person_id;
    end if;
    return new;
end;
$$ language plpgsql;

Und hängen Sie es so an:

create trigger pseudo_fk_for_address_trigger before insert or update on address 
for each row execute procedure pseudo_fk_for_address();

Dann erhalten Sie einen Fehler wie diesen, wenn Sie versuchen, eine Adresse für jemanden hinzuzufügen, der in person nicht existiert (einschließlich der Tabellen, die davon erben):

playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR:  No such person: 3

Sie möchten person einen BEFORE DELETE-Trigger hinzufügen Um baumelnde Verweise zu vermeiden, wäre diese Grundstruktur ziemlich gleich. Vielleicht möchten Sie einen Index für address.person_id um auch den BEFORE DELETE-Trigger zu unterstützen.

Referenzen: