2012-04-13 53 views
0

我創建了兩個表,做了以下內容:爲什麼我可以用外鍵約束自由輸入值

表1(學生)

CREATE TABLE student(s int, n int, d int, PRIMARY KEY(s), FOREIGN KEY(d) REFERENCES dep(d)); 

表2:(DEP)

CREATE TABLE dep(d int, n int, PRIMARY KEY(d)); 

所以,如果我理解正確,d是表1的外鍵,它引用了部門的主鍵。因此,dep的主鍵必須與學生中的d相匹配。然而,當我做以下

INSERT INTO dep (1,2); 

該聲明完成沒有錯誤?學生表是空的,如何在參考主鍵時插入數據?

請幫忙,謝謝。

順便我也能夠自由地插入到學生甚至dep沒有相應的價值。你們認爲這是因爲MySQL與甲骨文?

mysql> select * from student; 
+---+------+------+ 
| s | n | d | 
+---+------+------+ 
| 5 | 5 | 5 | 
+---+------+------+ 
1 row in set (0.00 sec) 

mysql> select * from dep; 
+---+------+ 
| d | n | 
+---+------+ 
| 1 | 2 | 
+---+------+ 
1 row in set (0.00 sec) 

回答

2

學生表具有外鍵d,它是dep表的主鍵。學生表是依賴於dep表的人。 dep表對學生表沒有這種依賴性。學生表上的約束條件是應該始終在dep表中。

將一條記錄插入到學生表中,其中d的值無效將導致錯誤。

+0

嗯,我能夠自由地插入隨機數的學生,你認爲它是因爲它是其他SQL比Orable? – eastboundr 2012-04-13 04:19:39

+0

它無關,與它是SQL或Oracle。你怎麼能夠插入學生表?在創建外鍵約束之前還是之後?你肯定對student.d隨機值是不是在DEP表? – rikitikitik 2012-04-13 04:22:13

2

你已經理解了錯誤的方法。你已經在你的SQL做的是確保當你輸入一個Student,爲d值必須在dep.d

存在的價值,如果你說

insert into student values (1, 2, 3) 

然後,如果有這將不會失敗排在depd等於3

1

您可以插入department表上仍然有此表沒有限制。

如果您嘗試使用部門表中不存在的隨機部門號在學生表中添加一行,則會給出約束錯誤。

例子:如果你會嘗試

insert into student values (1, 4, 1034); 

,如果有部門表中沒有行與主鍵1034值,那麼它會給外鍵約束。

你需要做的是從父母開始往下插入你的數據。

如果您需要刪除實際必須以其他方式刪除的數據,請在刪除父項目記錄之前刪除項目。

0

像往常一樣,當你將數據插入到細節表和主表沒有對應的值,你得到一個錯誤 - 「不能添加或更新子行,外鍵約束失敗......」。

但當FOREIGN_KEY_CHECKS變量設置爲0時,MySQL忽略外鍵約束 -

SET FOREIGN_KEY_CHECKS=0; 
INSERT INTO student VALUES (5,5,5); -- no errors 
SET FOREIGN_KEY_CHECKS=1;