PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Gunakan pemicu pada tabel yang diwarisi untuk mengganti kunci asing

Pertama-tama singkirkan FK dengan sesuatu seperti ini:

alter table address drop constraint address_person_id_fkey

Jika itu mengeluh tentang tidak adanya address_person_id_fkey kendala kemudian gunakan \d address; di psql untuk mengetahui apa itu FK.

Maka pemicu sederhana seperti ini akan berhasil:

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;

Dan lampirkan seperti ini:

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

Kemudian Anda akan mendapatkan kesalahan seperti ini jika Anda mencoba menambahkan alamat untuk seseorang yang tidak ada di person (termasuk tabel yang mewarisinya):

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

Anda ingin menambahkan pemicu SEBELUM DELETE ke person untuk menghindari referensi yang menggantung, struktur dasarnya akan hampir sama. Anda mungkin menginginkan indeks di address.person_id untuk membantu mendukung pemicu BEFORE DELETE juga.

Referensi:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat array untuk nilai dari daftar kolom yang diekstraksi di Postgres

  2. PostgreSQL:KUNCI ASING/ON DELETE CASCADE

  3. Cara memperbarui ID urutan postgreSQL secara massal untuk semua tabel

  4. Bagaimana cara menentukan jenis indeks apa yang akan digunakan di Postgres?

  5. Ubah bahasa sistem dan pesan kesalahan di PostgreSQL