Rumah >pangkalan data >tutorial mysql >Mengapa Rujukan Kunci Asing Postgres 9.1 Saya Gagal dengan Ralat 'Kekangan Unik'?
Menyelesaikan ralat "Kekangan unik yang tidak dapat diselesaikan" dalam rujukan kunci asing PostgreSQL 9.1
Apabila mencipta struktur jadual yang mengandungi rujukan kunci asing dalam PostgreSQL 9.1, anda mungkin menghadapi ralat yang tidak dijangka. Ralat ini terhasil daripada konfigurasi kekangan yang tidak konsisten.
Kod SQL yang dimaksudkan melibatkan penciptaan tiga jadual: foo, bar dan baz. Jadual foo mempunyai kunci utama pada lajur nama, manakala jadual bar mentakrifkan lajur foo_fk sebagai kunci asing yang merujuk foo(nama). Walau bagaimanapun, mesej ralat mengadu bahawa lajur nama yang dirujuk dalam jadual bar tidak mempunyai kekangan unik.
Untuk memahami masalah ini, pertimbangkan senario di mana berbilang baris dalam jadual bar berkongsi nilai nama yang sama, seperti yang ditunjukkan dalam contoh berikut:
<code class="language-sql">INSERT INTO bar (foo_fk, name) VALUES ('alice', 'ams'); INSERT INTO bar (foo_fk, name) VALUES ('bob', 'ams');</code>
Sekarang, jika kita cuba memasukkan baris ke dalam jadual baz dan merujuk nilai ams yang tidak jelas dalam jadual bar, PostgreSQL tidak akan dapat mengenal pasti baris sasaran secara unik. Kekaburan ini timbul kerana PostgreSQL tidak dapat menentukan baris dalam jadual bar yang harus dirujuk oleh kunci asing.
Penyelesaian adalah untuk menguatkuasakan keunikan lajur nama dalam jadual bar. Dengan menambahkan kekangan unik pada lajur nama, kami memastikan setiap baris dalam jadual bar mempunyai nilai nama yang berbeza, sekali gus menghapuskan kekaburan dan membenarkan PostgreSQL mengenal pasti baris yang dirujuk secara unik.
Kod SQL yang diperbetulkan termasuk kekangan yang diperlukan adalah seperti berikut:
<code class="language-sql">CREATE TABLE foo ( name VARCHAR(256) PRIMARY KEY ); CREATE TABLE bar ( pkey SERIAL PRIMARY KEY, foo_fk VARCHAR(256) NOT NULL REFERENCES foo(name), name VARCHAR(256) NOT NULL, UNIQUE (name) -- 添加唯一约束 ); CREATE TABLE baz( pkey SERIAL PRIMARY KEY, bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name), name VARCHAR(256) );</code>
Dengan kekangan unik ini, PostgreSQL kini boleh berjaya mencipta struktur jadual dan mengelakkan ralat "Tiada kekangan unik yang sepadan dengan kunci yang diberikan".
Atas ialah kandungan terperinci Mengapa Rujukan Kunci Asing Postgres 9.1 Saya Gagal dengan Ralat 'Kekangan Unik'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!