2

MySqlと同様に、空の列を増分値で更新(塗りつぶし)したいのですが、Oracleを使用します。つまり後

ALTER TABLE data ADD
(
  id  number
);

すべてのレコードで、ID列が一意の値を受け取るようにします。その後、NotNull一意の制約を有効にして主キーにします。

私はすぐに思いついた

UPDATE TABLE data SET id = rownum;

しかし、私はこれについて悪い気持ちを持っています。私のテストでは期待どおりに機能しますが、例は証明されていません:-)

rownumステートメントでこのように使用するのは安全updateですか?

4

3 に答える 3

4

はい、その方法で問題が発生したことはありませんが、null以外の一意の制約を有効にしても、主キーにはなりません。主キー制約を追加すると、主キーになります;)

于 2013-03-12T11:38:11.343 に答える
0

おそらく、あなたの方法は安全です。そうでない場合は、一意の制約が失敗した場合に通知されます:-)。

防弾方法は次のとおりです。

lock table data in exclusive mode;

merge into data t
using (select t.rowid rid, t.rownum id from data t) s
on (t.rowid = s.rid)
when matched then update set
  t.id = s.id;

commit;
于 2013-03-12T11:26:49.267 に答える
-3

いいえ、ROWNUMは疑似列であるため、安全ではありません。特にORDERBYで使用する場合、シーケンスが保証されないことを意味します。必要な場合は、ROWNUMの代わりにROW_NUMBER()OVER(ORDER BY your_field)を使用してください。PL / SQLを使用して、ループ内でテーブルを更新することもできます。

于 2013-03-12T12:58:13.450 に答える