Saya tidak pernah "kode tangan" kode pembuatan objek untuk SQL Server dan decleration kunci asing tampaknya berbeda antara SQL Server dan Postgres. Ini sql saya sejauh ini:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Ketika saya menjalankan kueri saya mendapatkan kesalahan ini:
Msg 8139, Level 16, State 0, Line 9 Jumlah kolom referensi dalam kunci asing berbeda dari jumlah kolom yang direferensikan, tabel 'question_bank'.
Bisakah Anda menemukan kesalahan?
sql
sql-server
tsql
mmattax
sumber
sumber
Jawaban:
sumber
Dan jika Anda hanya ingin membuat kendala sendiri, Anda dapat menggunakan ALTER TABLE
Saya tidak akan merekomendasikan sintaks yang disebutkan oleh Sara Chipps untuk pembuatan inline, hanya karena saya lebih suka menyebutkan kendala saya sendiri.
sumber
Anda juga dapat memberi nama batasan kunci asing Anda dengan menggunakan:
sumber
Saya suka jawaban AlexCuse, tetapi sesuatu yang harus Anda perhatikan setiap kali Anda menambahkan batasan kunci asing adalah bagaimana Anda ingin pembaruan ke kolom yang direferensikan di deretan tabel yang direferensikan untuk diperlakukan, dan terutama bagaimana Anda ingin menghapus baris dalam yang direferensikan meja untuk dirawat.
Jika batasan dibuat seperti ini:
.. lalu memperbarui atau menghapus dalam tabel referensi akan meledak dengan kesalahan jika ada baris yang sesuai dalam tabel referensi.
Itu mungkin perilaku yang Anda inginkan, tetapi dalam pengalaman saya, itu jauh lebih umum tidak.
Jika Anda membuatnya seperti ini:
..kemudian pembaruan dan penghapusan di tabel induk akan menghasilkan pembaruan dan menghapus baris yang sesuai di tabel referensi.
(Saya tidak menyarankan bahwa default harus diubah, default salah di sisi hati-hati, yang bagus. Saya hanya mengatakan itu adalah sesuatu yang harus selalu diperhatikan oleh orang yang menciptakan kendala .)
Ini bisa dilakukan, ketika membuat tabel, seperti ini:
sumber
--Itu akan bekerja juga. Mungkin membangun konstruksi yang sedikit lebih intuitif?
sumber
Untuk membuat kunci asing di tabel apa pun
sumber
Jika Anda ingin membuat dua kolom tabel menjadi suatu hubungan dengan menggunakan kueri coba yang berikut ini:
sumber
Seperti Anda, saya biasanya tidak membuat kunci asing dengan tangan, tetapi jika karena alasan tertentu saya memerlukan skrip untuk melakukannya maka saya biasanya membuatnya menggunakan ms sql server manajemen studio dan sebelum menyimpan kemudian berubah, saya memilih Table Designer | Buat Skrip Perubahan
sumber
Script ini adalah tentang membuat tabel dengan kunci asing dan saya menambahkan kendala integritas referensial sql-server .
sumber
Necromancing.
Sebenarnya, melakukan ini dengan benar sedikit lebih rumit.
Pertama-tama Anda perlu memeriksa apakah kunci utama ada untuk kolom yang Anda ingin atur kunci asing Anda untuk referensi.
Dalam contoh ini, kunci asing pada tabel T_ZO_SYS_Language_Forms dibuat, merujuk dbo.T_SYS_Language_Forms.LANG_UID
sumber
Saya selalu menggunakan sintaks ini untuk membuat batasan kunci asing antara 2 tabel
yaitu
sumber