SQL - 导致主键冲突的SQLDataAdapter更新

时间:2010-01-12 21:29:19

标签: c# sql primary-key insert-update sqldataadapter

我需要能够更改表中的主键。问题是,某些键将更改为现有键值。例如。 record1.ID 3 => 4和record2.ID 4 => 5。我需要保留这些作为主键,因为它们被设置为外键(级联更新)是否有合理的方法来实现这一点,或者我是否尝试sql heresey?

至于原因,我将来自这个主键链接的一组表中的数据插入/更新到另一组结构相似的表中。插入是部分的,因为它是重复数据删除过程的一部分,如果我可以简单地更新所有要用新主键插入的表,生活会更容易。

一种解决方案是启动目标表上的索引高于行计数将达到的传入表(每次传入表重新索引),但我仍然想知道是否可以执行以上,否则。

TIA

2 个答案:

答案 0 :(得分:1)

你正在尝试sql异端。我其实很开明,很多时候都必须做一些看似疯狂的事情。当人们傲慢地回答“你应该以不同的方式做事”,当他们知道情况是什么时,这让我很烦。但是我必须告诉你你应该以不同的方式做这件事。嘿嘿。

不,没有办法用sql \ DataAdapter优雅地做到这一点。您可以通过ADO.NET使用一系列t-sql命令 进行此操作。您必须每次打开身份覆盖模式(set identity_insert theTable on),执行查询,其中该表上的所有值都增加1,然后转为自动编号覆盖模式。但是,您需要将使用此作为外键的所有其他表增加。但等等,情况变得更糟:

  • 您需要在事务中完成所有这些操作,因为在此期间您无法对这些表进行任何其他操作,并且如果出现故障,您肯定需要回滚。这可能是一个很好的处理大块;你的桌子会被锁定好。
  • 如果这些表之间有任何外键约束,则需要在执行此操作之前关闭它们,然后再重新实现它们。

答案 1 :(得分:0)

如果您发现自己开始考虑更新主键值,则应该响铃警报铃声。 这似乎更容易,但我认为它更像是一个黑客而不是一个解决方案。就我个人而言,我正在重新思考并试图解决真正的问题 - 现在看起来可能更难,但维持和减少潜在的可怕问题会好得多。