1

我想了解不同数据库引擎的答案,但在我们的例子中;我们有一些记录对于一列来说不是唯一的,现在我们想让该列唯一,这迫使我们删除重复值。我们使用 Oracle 10g。这合理吗?还是这类似于 goto 语句:) ?我们真的应该删除吗?如果我们有数百万条记录怎么办?

4

5 回答 5

2

要回答发布的问题:不,它不能在我知道的任何 RDBMS 上完成

但是,像大多数事情一样,您可以通过执行以下操作来解决它。

使用新列和现有列创建复合键

您可以通过添加新列使其唯一而不删除任何内容,称为 PartialKey。

对于现有行,您将 PartialKey 设置为唯一值(从零开始)。

在现有列和 PartialKey 上创建唯一约束(您可以这样做,因为现在这些行中的每一行都是唯一的)。

对于新行,仅对 PartialKey 使用默认值零(因为已使用零),这将强制现有列在表中具有唯一值。

重要编辑

这很弱 - 如果您删除具有部分键 0 的行。现在可以添加另一行,其值已经在现有列中,因为部分键中的 0 将保证唯一性。

您需要确保

  1. 您永远不会删除带有部分键 0 的行
  2. 您总是有一个带有部分键 0 的虚拟行,并且您永远不会删除它(或者您立即自动重新插入它)

编辑:咬紧牙关清理数据

如果如您所说,您刚刚意识到该列应该是唯一的,那么您应该(如果可能)清理数据。上述方法是一种 hack,您会发现自己在访问表时编写了更多 hack(您可能会发现您有两组逻辑用于处理针对该表的查询,一组用于列唯一的位置,另一组用于不是。我现在就把它清理干净,否则它会回来咬你一千遍。

于 2009-01-26T13:23:42.120 回答
2

这可以在 SQL Server 中完成。

创建检查约束时,您可以设置一个选项以将其仅应用于新数据或也应用于现有数据。当您知道现有数据已经​​满足新的检查约束时,或者当业务规则要求仅从此时开始强制执行约束时,仅将约束应用于新数据的选项很有用。

例如

ALTER TABLE myTable 
WITH NOCHECK
ADD CONSTRAINT myConstraint CHECK ( column > 100 )
于 2009-01-26T13:55:07.720 回答
1

在添加约束之前,您必须直接设置记录。

于 2009-01-26T13:19:47.043 回答
1

您可以使用 NOVALIDATE ENABLE 约束状态来执行此操作,但删除是更优选的方式。

于 2009-01-26T14:24:50.110 回答
0

在 Oracle 中,您可以将约束置于启用 novalidate 状态。当约束处于启用 novalidate 状态时,将检查所有后续语句是否符合约束。但是,不会检查表中的任何现有数据。启用 novalidated 约束的表可以包含无效数据,但不能向其中添加新的无效数据。在 novalidated 状态下启用约束在上传有效 OLTP 数据的数据仓库配置中最有用。

于 2009-01-27T07:29:13.410 回答