我想学习不同数据库引擎的答案,但在我们的案例中; 我们有一些不是列唯一的记录,现在我们想让该列唯一,这迫使我们删除重复的值。 我们使用Oracle 10g。这合理吗?或者这是像goto语句:)?我们真的要删除吗?如果我们有数百万条记录怎么办?
答案 0 :(得分:2)
回答发布的问题:不,在我知道的任何RDBMS上都无法完成。
然而,像大多数事情一样,你可以通过以下方式解决它。
使用新列和现有列
创建复合键您可以通过添加新列将其命名为唯一而不删除任何内容,将其命名为PartialKey。
对于现有行,您将PartialKey设置为唯一值(从零开始)。
在现有列和PartialKey上创建一个唯一约束(您可以这样做,因为这些行中的每一行现在都是唯一的。)
对于新行,仅对PartialKey使用默认值Zero(因为已经使用了零),这将强制现有列在表中具有unqiue值。
重要编辑
这很弱 - 如果删除部分键为0的行。现在可以添加另一行,其值已经存在于现有列中,因为部分键中的0将保证唯一性。
您需要确保
编辑:咬紧牙关并清理数据
如果您刚才意识到该列应该是唯一的,那么您应该(如果可能的话)清理数据。上面的方法是一个黑客,你会发现自己在访问表时会写更多的黑客攻击(你可能会发现你有两组逻辑来处理针对该表的查询,一组用于列唯一的列,一个用于它不是。我现在要清理它,否则它会回来并在屁股上咬你一千次。
答案 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数据的数据仓库配置中最有用。