2010-01-12 59 views
2

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

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

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

TIA

+0

因此,如果现有记录的主键已更改,并且其他表上的相关外键,但** new **记录绝对必须具有与其他数据库中的键相同的键才行。是吗?因为,如果你只是给插入记录添加新密钥,并且在其他表上添加所有**相关记录,那将是非常好的。这会让这很容易。 – 2010-01-12 21:41:20

回答

1

您正在尝试SQL异端。我其实很开明,知道很多时候我们必须做一些看起来很疯狂的事情。当人们傲慢地回答“你应该以不同的方式做出回答”,当他们知道情况是什么的时候,它会让我很烦恼。不过,我必须告诉你,你应该这样做。嘿嘿。

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

  • 您将需要这一切在交易,因为你不能有任何其他在此期间,发生在这些表,因为如果有一个失败,你都肯定需要回滚。这可能是一大块大小的处理;你的表格会被锁定好一点。
  • 如果您在这些表之间有任何外键约束,您需要先关闭它们,然后再重新执行它们。
+0

给出的例子是为了清晰。他们正在根据唯一列映射到决赛桌中的不同ID。我需要使用正确的外键将映射移动到它们各自的最终表中。 在插入/更新它们到最终表中之前,我可以更新每个表中每行的外键,它看起来像我可以在这里作弊一点。 – Brian 2010-01-12 22:01:44

+0

啊,好的。因此,如果现有表格的关键字是45,987,并且数字是否可以将您的20,000条记录添加到50,001到70,000?如果身份领域存在差距,那很好。 (或者,如果不是,你只需要在最后一刻更新映射表并停止正常进程的新插入。)这似乎是对我来说最直接的方式,但我猜测我错过了一些东西。我错过了什么? – 2010-01-12 22:11:23

+0

对于新实体,这可以工作,但其中一些实体与现有记录相对应,并且只有它们的关联表可能需要更新或插入数据。提到源表和目标表集都是星形模式可能很有帮助,中心表由id和几个唯一标识的列组成。 – Brian 2010-01-13 16:29:30

0

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

+0

主键将改变的表格是工作表。经过大量处理后,它们的行被插入(或更新)到实际的表中。实际表中的行必须有不同的主键。更新中央临时表中的主键似乎是一种简单的方法,可以将由中央表的主键链接的所有临时表保持在一起,直到其数据插入到最终表中。它似乎不再那么多了。 – Brian 2010-01-12 21:55:11