Saya memiliki tabel yang memiliki beberapa kolom ID ke tabel lain.
Saya ingin kunci asing memaksa integritas hanya jika saya memasukkan data ke sana. Jika saya melakukan pembaruan di lain waktu untuk mengisi kolom itu, maka itu juga harus memeriksa kendala.
(Ini kemungkinan tergantung pada database server, saya menggunakan tipe tabel MySQL & InnoDB)
Saya percaya ini adalah harapan yang masuk akal, tetapi perbaiki jika saya salah.
sql
mysql
database
foreign-keys
bender
sumber
sumber
Jawaban:
Ya, Anda bisa memberlakukan batasan hanya ketika nilainya tidak NULL. Ini dapat dengan mudah diuji dengan contoh berikut:
Sisipan pertama akan lulus karena kami menyisipkan NULL di
parent_id
. Sisipan kedua gagal karena batasan kunci asing, karena kami mencoba memasukkan nilai yang tidak ada dalamparent
tabel.sumber
parent_id INT NULL
bagian ini (secara verbal) sama denganparent_id int default null
int
alih-alihInteger
anggota kelas Anda, defaultnya tidak akan pernah menjadi nol, tetapi akan menjadi 0 dan Anda akan gagal batasannya.Saya menemukan bahwa ketika menyisipkan, nilai kolom nol harus secara khusus dinyatakan sebagai NULL, jika tidak saya akan mendapatkan kesalahan pelanggaran kendala (sebagai lawan dari string kosong).
sumber
INSERT INTO {table} {list_of_columns}
? Karena itu berlaku untuk saya; menghilangkan penyebutan kolom menyebabkan kesalahan, tetapi termasuk dan secara eksplisit mengatur untuk memperbaiki kesalahan NULL. Jika saya benar, saya pikir komentar @ Gary tidak berlaku (karena Anda tidak bermaksud string kosong), tetapi @Kevin Coulombe bisa membantu ...Ya, itu akan berfungsi seperti yang Anda harapkan. Sayangnya, saya sepertinya kesulitan menemukan pernyataan eksplisit tentang hal ini di manual MySQL .
Kunci asing berarti nilainya harus ada di tabel lain. NULL mengacu pada tidak adanya nilai, jadi ketika Anda mengatur kolom ke NULL, tidak masuk akal untuk mencoba menegakkan batasan itu.
sumber
Di atas berfungsi tetapi ini tidak. Catat ON DELETE CASCADE
sumber
Ya, nilainya bisa NULL, tetapi Anda harus eksplisit. Saya telah mengalami situasi yang sama ini sebelumnya, dan mudah untuk melupakan MENGAPA ini terjadi, sehingga perlu sedikit untuk mengingat apa yang perlu dilakukan.
Jika data yang dikirim dicetak atau ditafsirkan sebagai string kosong, itu akan gagal. Namun, dengan secara eksplisit menetapkan nilai ke NULL saat INSERTING atau UPDATING, Anda siap melakukannya.
Tapi ini menyenangkan pemrograman, bukan? Buat masalah kita sendiri dan perbaiki! Bersulang!
sumber
Cara lain untuk ini adalah dengan memasukkan elemen DEFAULT di tabel lain. Misalnya, referensi apa pun ke uuid = 00000000-0000-0000-0000-000000000000 pada tabel lainnya akan menunjukkan tidak ada tindakan. Anda juga perlu mengatur semua nilai untuk id itu menjadi "netral", misalnya 0, string kosong, nol agar tidak mempengaruhi logika kode Anda.
sumber
Saya juga terjebak pada masalah ini. Tapi saya memecahkan hanya dengan mendefinisikan kunci asing sebagai
unsigned integer
. Temukan contoh di bawah ini-sumber