Saya punya tabel berikut,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Bagaimana cara mengubah messages
tabel sedemikian rupa sehingga,
- kolom baru yang disebut
sender
ditambahkan ke dalamnya - di mana
sender
kunci asing merujukusers
tabel
Ini tidak berhasil
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Apakah pernyataan ini tidak membuat kolom juga?
postgresql
foreign-key
alter-table
Hassan Baig
sumber
sumber
Jawaban:
Apa yang relatif mudah - Anda hanya perlu menambahkan langkah lain.
The
FOREIGN KEY
Kolom harus ada untuk menjadikannya sebuahFK
. Saya melakukan yang berikut (dari sini dan dokumentasinya ):Beberapa hal yang perlu diperhatikan:
SELALU memberikan kunci asing Anda nama yang berarti. Diberitahu bahwa kunci "SYS_C00308108" dilanggar tidak terlalu membantu. Lihat biola di sini untuk perilaku Oracle dalam keadaan ini, nama kuncinya akan bervariasi dari biola ke biola, tetapi beberapa string arbitrer dimulai dengan SYS _...)
Mempertimbangkan pernyataan Anda:
Ini akan menjadi "bagus untuk dimiliki" jika RDBMS dapat secara otomatis membuat bidang yang Anda inginkan dengan tipe data yang cocok dengan bidang yang dirujuk. Yang ingin saya katakan adalah bahwa mengubah DDL adalah (atau setidaknya seharusnya) operasi yang jarang digunakan dan bukan sesuatu yang ingin Anda lakukan secara teratur. Ini juga berisiko menambah dokumentasi yang sudah cukup besar.
Setidaknya PostgreSQL mencoba melakukan sesuatu yang masuk akal - itu menggabungkan nama tabel, nama
FOREIGN KEY
bidang_fkey
dan bahkan menambahkanDETAIL: Key (sender_id)=(56) is not present in table "user_".
untuk memberikan sesuatu yang mungkin masuk akal bagi manusia - lihat biola di sini .sumber
"y_z_fkey"
. Aku berpendapat bahwa nama yang lebih baik dariy_x_fkey
karena melanggar Anda tidak memberitahu Anda kolom Anda Memasukkan sedang dalam yang menyebabkan kesalahan. Saya tidak terlalu peduli tentang ke mana arahnya. Sebagai aturan umum, Anda harus TIDAK PERNAH menamai fkeys Anda dan membiarkan PostgreSQL default menanganinya.ON UPDATE CASCADE ON DELETE CASCADE;
dalam contoh, terutama tanpa alasan. Itu membuat contoh lebih kompleks, dan Anda tidak perlu repot menjelaskan apa itu. Saya untuk satu biasanya tidak ingin menghapus kaskade.y_x_fkey
atauy_z_fkey
ataux__y_FK
, asalkan konsisten.Saya tidak yakin mengapa semua orang mengatakan kepada Anda bahwa Anda harus melakukan ini dalam dua langkah. Faktanya, Anda tidak . Anda mencoba menambahkan
FOREIGN KEY
yang mengasumsikan, dengan desain, kolom ada di sana dan melemparkan kesalahan itu jika kolom tidak ada di sana. Jika Anda menambahkanCOLUMN
, Anda dapat membuatnya secara eksplisitFOREIGN KEY
pada kreasi denganREFERENCES
,Akan bekerja dengan baik. Anda dapat melihat sintaks di
ALTER TABLE
sini,Dengan "action" sebagai,
Contoh-contoh ini bahkan ada dalam dokumen,
Tetapi semua itu tidak diperlukan karena kita bisa mengandalkan autonaming dan resolusi kunci utama (jika hanya nama tabel yang ditentukan maka Anda merujuk kunci utama).
sumber
CASE1: Jika Anda perlu membuat kunci asing saat membuat tabel baru
Perintah di atas akan membuat tabel dengan nama 'table1' dan tiga kolom bernama 'id' (kunci utama), 'kolom1', 'table2_id' (kunci asing dari table1 yang mereferensikan kolom id dari table2).
'Seri' DATATYPE akan membuat kolom yang menggunakan tipe data ini sebagai kolom yang dibuat secara otomatis, saat memasukkan nilai ke dalam tabel Anda tidak perlu menyebutkan kolom ini sama sekali, atau Anda dapat memberikan 'default' tanpa tanda kutip di tempat nilai.
Kolom kunci utama selalu ditambahkan ke indeks tabel dengan nilai 'tablename_pkey'.
Jika kunci asing ditambahkan pada waktu pembuatan tabel, CONSTRAINT ditambahkan dengan pola '(present_table_name) _ (foreign_key_id_name) _fkey'.
Ketika menambahkan kunci asing, kita harus memasukkan kata kunci 'REFERENSI' di sebelah nama kolom karena kita ingin memberi tahu postgres bahwa kolom ini mereferensikan sebuah tabel dan kemudian di samping referensi kita harus memberikan tabel untuk referensi dan dalam kurung memberikan nama kolom dari tabel yang direferensikan, biasanya kunci asing diberikan sebagai kolom kunci utama.
KASUS 2: Jika Anda ingin kunci asing ke tabel yang ada di kolom yang ada
CATATAN: tanda kurung '()' setelah KUNCI LUAR NEGERI dan REFERENSI tabel2 adalah wajib atau postgres lain akan menimbulkan kesalahan.
sumber
Saya tahu masalahnya. Nama kolom berbeda. Mungkin dalam satu kolom, ada ruang tambahan setelah nama kolom Anda, jadi harap hati-hati memastikan nama kolom Anda sama persis.
sumber