2012-03-29 74 views
0

我有一個關係表,表看起來是這樣的插入條目只有一次

------------------------ 
| client_id | service_id | 
------------------------ 
| 1   | 1   | 
| 1   | 2   | 
| 1   | 4   | 
| 1   | 7   | 
| 2   | 1   | 
| 2   | 5   | 
------------------------ 

我有新的權限,我需要添加一個名單,我在做什麼現在的問題是,例如,如果我有ID爲1添加新權限的客戶,我做

DELETE FROM myTable WHERE client_id = 1 
INSERT INTO .... 

有沒有更有效的辦法,我只能刪除那些我以後不會插入,和只添加了新的?

+0

你正在刪除的主鍵,反正這麼快,我真的不會擔心它。 否則,您必須將您要插入的service_id列表放在一起,並將其作爲where條件添加到刪除中,如下所示: DELETE FROM myTable WHERE client_id = @myId AND service_id NOT IN(@ serviceIds) 這可能需要更多的內存/時間,而不僅僅是刪除。 – robertvoliva 2012-03-29 14:51:06

+0

@robertvoliva:在主鍵上查找速度非常快,但刪除項目可能不會。數據庫服務器試圖根據主鍵保持整個表的排列順序。當你刪除項目時,數據庫必須確定它是否需要重構它如何存儲數據。有點像從書架上拿下一堆書:在某個時候,圖書管理員必須花時間轉移所有書籍,所以你最終不會得到大部分空的書架。 – StriplingWarrior 2012-03-29 15:04:37

回答

1

是的,你可以做到這一點,但在我的愚見,這不是真的sql相關主題。實際上它取決於你的語言/平臺選擇。如果您使用的功能強大的平臺如.NETJava,則有許多數據庫類,如adapters,datasets等,它們能夠爲您找到更換零件,更新/插入/刪除只有必要的零件等等。

我更喜歡使用hibernate/nhibernate像庫。在這種情況下,你甚至不需要大部分時間編寫sql查詢。只需在oop級別進行操作並與數據庫同步即可。

+0

我正在使用.NET,數據集在這種情況下如何幫助我? – gosukiwi 2012-03-29 16:07:27

+1

如果您將DataSet與DataAdapters一起使用,DataAdapters將幫助您實現目標。仔細閱讀本頁,特別是第二段。 http://msdn.microsoft.com/en-us/library/33y2221y(v=vs.100).aspx – 2012-03-30 11:19:14

+0

哦,我明白了,謝謝:)我認爲這樣做。 – gosukiwi 2012-03-30 13:31:06

0

如果你把新的權限到另一個表,你可以這樣做:

DELETE FROM myTable WHERE client_id in (SELECT client_id FROM tmpTable); 

INSERT INTO myTable AS (SELECT client_id, service_id FROM tmpTable); 

你還在服用2次傳球,但你在做他們全部一次,而不是一次一個。