DB约束可以忽略现有记录并仅申请新数据吗?

时间:2009-01-26 13:17:38

标签: database constraints

我想学习不同数据库引擎的答案,但在我们的案例中; 我们有一些不是列唯一的记录,现在我们想让该列唯一,这迫使我们删除重复的值。 我们使用Oracle 10g。这合理吗?或者这是像goto语句:)?我们真的要删除吗?如果我们有数百万条记录怎么办?

5 个答案:

答案 0 :(得分:2)

回答发布的问题:不,在我知道的任何RDBMS上都无法完成。

然而,像大多数事情一样,你可以通过以下方式解决它。

使用新列和现有列

创建复合键

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

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

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

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

重要编辑

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

您需要确保

  1. 您永远不会删除该行 部分键0
  2. 你总是有一个假行 部分键0,你永远不会删除 它(或你立即自动重新插入)
  3. 编辑:咬紧牙关并清理数据

    如果您刚才意识到该列应该是唯一的,那么您应该(如果可能的话)清理数据。上面的方法是一个黑客,你会发现自己在访问表时会写更多的黑客攻击(你可能会发现你有两组逻辑来处理针对该表的查询,一组用于列唯一的列,一个用于它不是。我现在要清理它,否则它会回来并在屁股上咬你一千次。

答案 1 :(得分:2)

这可以在SQL Server中完成。

  

创建检查约束时   您可以设置应用它的选项   要么只是新数据,要么是现有数据   数据也是如此。申请的选择   仅对新数据的约束   当你知道现有的时候很有用   数据已经符合新的检查   约束,或业务规则   要求强制执行约束   只是从这一点开始。

例如

ALTER TABLE myTable 
WITH NOCHECK
ADD CONSTRAINT myConstraint CHECK ( column > 100 )

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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