主キーのない列がいくつかあり、主キー列を追加したい.
NAME Age
-------------
Peter 45
Bob 25
John 56
Peter 45
シーケンスとトリガーを使用してPKを追加することを提案する同僚: 自動増分主キーを既存に追加するOracleのテーブル
これは素晴らしいですが、私の顧客はシーケンスまたはトリガーを追加する権限のないデータベースユーザーを使用します。何十人ものDBA管理者に連絡して、ユーザー権限を変更したり、スクリプトを実行したりするのを防ぎたいです。
更新ステートメントのみでPKを追加することをお勧めします:(手順2でサポートが必要です)
ステップ1: ID列を作成します(このためのDB権限を持っています)
ALTER TABLE PERSON ADD ID NUMBER(10,0);
ステップ2:質問:行の順序などに基づいて、ID列を一意の値で初期化できますか?方法
UPDATE PERSON SET ID = something-unique
ステップ3:主キー制約のあとがきを追加します:(I DB have this rights)
ALTER TABLE PERSON ADD CONSTRAINT PK_ID PRIMARY KEY(ID);
ステップ4:あとがき:主キーは、アプリケーションによって管理および追加されます。
これが結果になります:
ID(PK) NAME Age
---------------------
1 Peter 45
2 Bob 25
3 John 56
4 Peter 45
どうもありがとう!
Update person set id = rownum;
このアイデアは非常に幼稚ですが、テーブルに大量の行がない場合は正常に機能するはずです。
ステップ2では、次のようなforループを実行します。
declare
i pls_integer :=1;
begin
for rec in (select name,age, rowid from table_name)
loop
update table_name set id = i
where
table_name.name=rec.name
and table_name.age=rec.age
and table_name.rowid = rec.rowid;
i:=i+1;
end loop;
end;