Dalam PostgreSQL 8, apakah mungkin menambahkan ON DELETE CASCADES
kedua kunci asing di tabel berikut tanpa menjatuhkan yang terakhir?
# \d scores
Table "public.scores"
Column | Type | Modifiers
---------+-----------------------+-----------
id | character varying(32) |
gid | integer |
money | integer | not null
quit | boolean |
last_ip | inet |
Foreign-key constraints:
"scores_gid_fkey" FOREIGN KEY (gid) REFERENCES games(gid)
"scores_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
Kedua tabel yang direferensikan di bawah - di sini:
# \d games
Table "public.games"
Column | Type | Modifiers
----------+-----------------------------+----------------------------------------------------------
gid | integer | not null default nextval('games_gid_seq'::regclass)
rounds | integer | not null
finished | timestamp without time zone | default now()
Indexes:
"games_pkey" PRIMARY KEY, btree (gid)
Referenced by:
TABLE "scores" CONSTRAINT "scores_gid_fkey" FOREIGN KEY (gid) REFERENCES games(gid)
Dan di sini:
# \d users
Table "public.users"
Column | Type | Modifiers
------------+-----------------------------+---------------
id | character varying(32) | not null
first_name | character varying(64) |
last_name | character varying(64) |
female | boolean |
avatar | character varying(128) |
city | character varying(64) |
login | timestamp without time zone | default now()
last_ip | inet |
logout | timestamp without time zone |
vip | timestamp without time zone |
mail | character varying(254) |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "cards" CONSTRAINT "cards_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "catch" CONSTRAINT "catch_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "chat" CONSTRAINT "chat_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "game" CONSTRAINT "game_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "hand" CONSTRAINT "hand_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "luck" CONSTRAINT "luck_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "match" CONSTRAINT "match_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "misere" CONSTRAINT "misere_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "money" CONSTRAINT "money_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "pass" CONSTRAINT "pass_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "payment" CONSTRAINT "payment_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "rep" CONSTRAINT "rep_author_fkey" FOREIGN KEY (author) REFERENCES users(id)
TABLE "rep" CONSTRAINT "rep_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "scores" CONSTRAINT "scores_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
TABLE "status" CONSTRAINT "status_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
Dan juga saya bertanya-tanya apakah masuk akal untuk menambahkan 2 index'es ke tabel sebelumnya?
UPDATE: Terima kasih, dan saya juga sudah mendapat saran di milis, bahwa saya bisa mengelolanya dalam 1 pernyataan dan karenanya tanpa secara eksplisit memulai transaksi:
ALTER TABLE public.scores
DROP CONSTRAINT scores_gid_fkey,
ADD CONSTRAINT scores_gid_fkey
FOREIGN KEY (gid)
REFERENCES games(gid)
ON DELETE CASCADE;
postgresql
constraints
cascade
cascading-deletes
postgresql-8.4
Alexander Farber
sumber
sumber
pref_scores.gid
). Menghapus tabel yang direferensikan akan memakan waktu lama tanpa itu, jika Anda mendapatkan banyak baris di tabel itu. Beberapa database secara otomatis membuat indeks pada kolom referensi; PostgreSQL menyerahkannya kepada Anda, karena ada beberapa kasus yang tidak bermanfaat.Jawaban:
Saya cukup yakin Anda tidak bisa hanya menambah
on delete cascade
batasan kunci asing yang ada. Anda harus membuang kendala terlebih dahulu, lalu menambahkan versi yang benar. Dalam SQL standar, saya percaya cara termudah untuk melakukan ini adalahon delete cascade
, dan akhirnyaUlangi untuk setiap kunci asing yang ingin Anda ubah.
Tetapi PostgreSQL memiliki ekstensi non-standar yang memungkinkan Anda menggunakan beberapa klausa kendala dalam satu pernyataan SQL. Sebagai contoh
Jika Anda tidak tahu nama batasan kunci asing yang ingin Anda jatuhkan, Anda dapat mencarinya di pgAdminIII (cukup klik nama tabel dan lihat DDL, atau perluas hierarki hingga Anda melihat "Kendala"), atau Anda dapat menanyakan skema informasi .
sumber
NOT VALID
dan memvalidasi dalam transaksi terpisah? Saya punya pertanyaan yang belum terjawab tentang ini.Didasarkan pada jawaban @Mike Sherrill Cat Recall, inilah yang bekerja untuk saya:
sumber
Pemakaian:
Fungsi:
Sadarilah: fungsi ini tidak akan menyalin atribut kunci asing awal. Hanya membutuhkan nama tabel / nama kolom asing, menjatuhkan kunci saat ini dan menggantikannya dengan yang baru.
sumber