2015-05-11 31 views
0

目前我已經規範了幾個表,但我有一些問題。爲了保持簡單:主/外鍵

我有2個表格。 1:userAcces 2:userInformation

在userAcces中,「id」是主鍵,在userInformation中,「id」是外鍵。我如何確定何時將兩個表中的內容插入,id將保持不變。所以當我插入一些東西時,它們會自動平等。所以我可以用聯合語句輕鬆查詢它。

編輯另一個問題。

當你最終刪除了一些記錄,例如ID 1.你怎麼能確保所有的ID爲1的記錄將被刪除?如果你刪除了它,那麼ID順序看起來很奇怪不是嗎?

例如你「樂有:

id name 
3 james 
6 Elona 
9 Bryan 
+0

您插入到父表中,讓mysql爲其生成一個ID(例如auto_increment),用'last_insert_id()'檢索該ID,然後使用該ID插入到子表中。 –

+0

對不起,我使用了錯誤的標籤。這是一個mssql服務器。我還能使用它嗎? – james

+0

您需要將userAccess中的id聲明爲具有對userInformation的參照完整性的外鍵。這將確保只有有效的userInformation id將被允許插入到userAccess中 – Tarik

回答

0

Here is an explanation using SQLFiddle

下面是代碼,只是爲了完整性...

設置:

CREATE TABLE ParentTable (
    ID int NOT NULL PRIMARY KEY, 
    Name varchar(50) 
) 

CREATE TABLE ChildTable (
    ID int NOT NULL PRIMARY KEY, 
    ParentID int NOT NULL FOREIGN KEY REFERENCES ParentTable(ID) ON DELETE CASCADE, 
    Description varchar(50) 
) 

INSERT ParentTable VALUES (1, 'Bob'); 
INSERT ParentTable VALUES (2, 'Tim'); 

INSERT ChildTable VALUES (1, 1, 'Bob''s Description'); 
INSERT ChildTable VALUES (2, 2, 'Tim''s Description'); 

例子:

SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID; 

-- This will fail 
INSERT ChildTable VALUES (3, 3, 'Judy''s Description'); 

-- It will succeed after inserting the Parent Record 
INSERT ParentTable VALUES (3, 'Judy'); 
INSERT ChildTable VALUES (3, 3, 'Judy''s Description'); 
SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID; 

-- Deleting the parent record will "cascade" the delete to the child table 
DELETE ParentTable WHERE ID = 1; 
SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID; 

外鍵約束將強制您所需的參照完整性。級聯刪除將允許用戶刪除父級,並自動刪除任何引用子級。如果沒有級聯刪除,如果父級被任何子級引用,任何刪除父級的嘗試都會失敗。