2012-03-29 50 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次传球,但你在做他们全部一次,而不是一次一个。