Rumah >pangkalan data >tutorial mysql >Mengapa Rujukan Kunci Asing Postgres 9.1 Saya Gagal dengan Ralat 'Kekangan Unik'?

Mengapa Rujukan Kunci Asing Postgres 9.1 Saya Gagal dengan Ralat 'Kekangan Unik'?

Patricia Arquette
Patricia Arquetteasal
2025-01-08 22:22:45689semak imbas

Why Does My Postgres 9.1 Foreign Key Reference Fail with a

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn