1

さまざまなDBエンジンの答えを知りたいのですが、私たちの場合は; 列に対して一意ではないレコードがいくつかあるため、その列を一意にする必要があるため、重複する値を削除する必要があります。Oracle 10g を使用しています。これは合理的ですか?それとも、これは goto ステートメントのようなものですか :) ? 本当に削除する必要がありますか?何百万ものレコードがあるとしたら?

4

5 に答える 5

2

投稿された質問に答えるには:いいえ、私が知っているRDBMSでは実行できません

ただし、ほとんどの場合と同様に、次のようにして回避できます。

新しい列と既存の列を使用して複合キーを作成します

新しい列を追加することで、何も削除せずに一意にすることができます。これをPartialKeyと呼びます。

既存の行については、PartialKeyを一意の値(ゼロから開始)に設定します。

既存の列とPartialKeyに一意性制約を作成します(これらの各行が一意になるため、これを行うことができます)。

新しい行の場合、PartialKeyにはデフォルト値のゼロのみを使用します(ゼロはすでに使用されているため)。これにより、既存の列のテーブルにunqiue値が強制されます。

重要な編集

これは弱いです-部分キー0の行を削除すると、部分キーの0が一意性を保証するため、既存の列にすでに存在する値で別の行を追加できるようになります。

どちらかを確認する必要があります

  1. 部分キー0の行を削除することはありません
  2. 部分キー0のダミー行が常にあり、それを削除することはありません(または、すぐに自動的に再挿入します)。

編集:弾丸をかみ、データをきれいにします

あなたが言ったように、列が一意でなければならないことに気付いた場合は、(可能であれば)データをクリーンアップする必要があります。上記のアプローチはハックであり、テーブルにアクセスするときにさらにハックを作成することに気付くでしょう(そのテーブルに対するクエリを処理するためのロジックのセットが2つあり、1つは列が一意である場合、もう1つはそうではありません。私は今これをきれいにします、さもなければそれは戻ってきて、千回以上お尻にあなたを噛みます。

于 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 状態にすることができます。制約が enable novalidate 状態にある場合、後続のすべてのステートメントが制約に準拠しているかどうかがチェックされます。ただし、テーブル内の既存のデータはチェックされません。enable novalidated 制約を持つテーブルには無効なデータが含まれる可能性がありますが、新しい無効なデータをテーブルに追加することはできません。無効化された状態で制約を有効にすることは、有効な OLTP データをアップロードしているデータ ウェアハウス構成で最も役立ちます。

于 2009-01-27T07:29:13.410 に答える