Kunci asing dan nilai NULL dalam lajur jadual pangkalan data
Dalam reka bentuk pangkalan data, kekangan kunci asing sering digunakan untuk memastikan integriti data dengan menguatkuasakan perhubungan antara jadual. Walau bagaimanapun, persoalan timbul: adakah lajur jadual dengan kunci asing dibenarkan untuk memegang nilai NULL?
Seperti yang ditunjukkan dalam soalan yang disediakan, mungkin terdapat situasi di mana kekangan kunci asing perlu dikuatkuasakan hanya apabila nilai ditetapkan secara eksplisit. Ini membolehkan rekod dengan nilai NULL pada mulanya dimasukkan dalam lajur kunci asing sambil memastikan integriti data selepas nilai diisi.
Dalam jenis jadual MySQL dan InnoDB, sememangnya mungkin untuk mempunyai kunci asing bukan NULL yang membenarkan nilai NULL. Contoh berikut menunjukkan ini:
<code class="language-sql">CREATE DATABASE t; USE t; CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT NULL, parent_id INT NULL, FOREIGN KEY (parent_id) REFERENCES parent(id) ) ENGINE=INNODB;</code>
Benarkan rekod dengan parent_id
menjadi NULL untuk dimasukkan ke dalam jadual child
:
<code class="language-sql">INSERT INTO child (id, parent_id) VALUES (1, NULL);</code>
Walau bagaimanapun, cubaan memasukkan rekod yang nilai parent_id
nya tidak wujud dalam jadual parent
akan mengakibatkan pelanggaran kekangan kunci asing:
<code class="language-sql">INSERT INTO child (id, parent_id) VALUES (2, 1); -- ERROR 1452 (23000): Cannot add or update a child row: a foreign key -- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY -- (`parent_id`) REFERENCES `parent` (`id`))</code>
Tingkah laku ini mengesahkan bahawa MySQL dan InnoDB membenarkan nilai NULL untuk lajur kunci asing dan hanya menguatkuasakan kekangan apabila nilai bukan NULL disediakan. Ini selaras dengan jangkaan bahawa kekangan kunci asing harus dikuatkuasakan apabila lajur kunci asing diisi dengan data, sambil membenarkan nilai NULL awal dalam lajur kunci asing.
Atas ialah kandungan terperinci Bolehkah Lajur Utama Asing Menerima Nilai NULL dalam InnoDB MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!