Di bawah ini contoh struktur tabel memberikan ERROR: tidak ada batasan unik yang diberikan kunci untuk tabel yang direferensikan, dan setelah menatapnya untuk sementara waktu sekarang saya tidak tahu mengapa kesalahan ini muncul dalam situasi ini.
BEGIN;
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 (foo_fk,name)
);
CREATE TABLE baz(
pkey SERIAL PRIMARY KEY,
bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name),
name VARCHAR(256)
);
COMMIT;
Menjalankan kode di atas memberikan kesalahan berikut, yang tidak masuk akal bagi saya, adakah yang bisa menjelaskan mengapa kesalahan ini muncul. Saya menggunakan postgres 9.1
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
NOTICE: CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar"
NOTICE: CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz"
ERROR: there is no unique constraint matching given keys for referenced table "bar"
********** Error **********
ERROR: there is no unique constraint matching given keys for referenced table "bar"
SQL state: 42830
sql
postgresql
am
sumber
sumber
Dalam postgresql semua kunci asing harus merujuk kunci unik di tabel induk, jadi di
bar
tabel Anda, Anda harus memilikiunique (name)
indeks.Lihat juga http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK dan secara khusus:
Tekankan milikku.
sumber
ketika Anda melakukan
UNIQUE
sebagai batasan level tabel seperti yang telah Anda lakukan maka apa yang Anda mendefinisikan adalah sedikit seperti kunci primer komposit melihat kendala ddl , di sini adalah ekstrakini berarti bahwa salah satu bidang dapat memiliki nilai yang tidak unik asalkan kombinasi tersebut unik dan ini tidak cocok dengan batasan kunci asing Anda.
kemungkinan besar Anda ingin kendala berada di level kolom. jadi alih-alih mendefinisikannya sebagai batasan level tabel, 'tambahkan'
UNIQUE
ke akhir definisi kolom sepertiname VARCHAR(60) NOT NULL UNIQUE
atau tentukan batasan level tabel indivdual untuk setiap bidang.sumber
Anda harus memiliki kolom nama sebagai batasan unik. di sini ada 3 baris kode untuk mengubah masalah Anda
Pertama cari tahu batasan kunci utama dengan mengetik kode ini
Anda ditampilkan seperti ini di bagian bawah
"some_constraint" PRIMARY KEY, btree (column)
Jatuhkan batasan:
Tambahkan kolom kunci utama baru dengan yang sudah ada:
Itu saja.
sumber