0

主キーのない古いテーブルを見つけました。テーブルを追加するには、新しい列を追加してシーケンス値を入力する必要があります。レコードが作成された時刻を含む別の列があるので、時刻の列で並べ替えられたテーブルにシーケンス値を挿入します。

どうすればいいのかわからない。PL\SQL を使用してみました - ORDER BY を使用してテーブルを返すクエリ用のカーソルを作成し、カーソルが返すレコードごとに更新しましたが、機能しませんでした。

これを行うためのスマートな作業方法はありますか?

前もって感謝します。

4

3 に答える 3

2

別のオプションは、行番号を生成するためにネストされたサブクエリのしわを使用して、相関サブクエリを使用することです。いくつかのサンプルデータの設定:

create table t42 (datefield date);
insert into t42 (datefield) values (sysdate - 7);
insert into t42 (datefield) values (sysdate + 6);
insert into t42 (datefield) values (sysdate - 5);
insert into t42 (datefield) values (sysdate + 4);
insert into t42 (datefield) values (sysdate - 3);
insert into t42 (datefield) values (sysdate + 2);

select * from t42;

DATEFIELD
---------
12-JUL-12
25-JUL-12
14-JUL-12
23-JUL-12
16-JUL-12
21-JUL-12

次に、新しい列を追加してデータを入力します。

alter table t42 add (id number);

update t42 t1 set t1.id = (
    select rn from (
        select rowid, row_number() over (order by datefield) as rn
        from t42
    ) t2
    where t2.rowid = t1.rowid
);

select * from t42 order by id;

DATEFIELD         ID
--------- ----------
12-JUL-12          1
14-JUL-12          2
16-JUL-12          3
21-JUL-12          4
23-JUL-12          5
25-JUL-12          6

これは合成キーなので、別の列の順序と一致させるのは少し無意味に思えますが、害はないと思います。


タスクを完了するには:

alter table t42 modify id not null;

alter table t42 add constraint t42_pk primary key (id);
于 2012-07-19T22:53:36.550 に答える
0
  • まず、新しいフィールドを作成し、null 値を許可します。

  • 次に、他のテーブルまたはクエリからフィールドを更新します。最善の方法は、mergeステートメントを使用することです。

ドキュメントのサンプルを次に示します。

MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*.01)
     WHERE (S.salary <= 8000);

ここに例文:

ALTER TABLE 
   customer 
MODIFY 
   ( 
   your_new_field varchar2(100) not null
   )
;
ALTER TABLE 
   customer 
ADD CONSTRAINT customer_pk PRIMARY KEY (your_new_field)
;
于 2012-07-19T19:36:22.500 に答える
0

簡単な方法の 1 つは、新しいテーブルを作成し、新しい列と他のすべての列を作成することです。

create table newt (
    newtID int primary key not null,
    . . .
)

次に、古いデータをすべて挿入します。

insert into newt
    select row_number() over (order by <CreatedAt>), t.*
    from t

(「*」を使用する代わりに、すべての列を置き換えることができます。列を名前で指定することをお勧めします。これはより短いことに加えて、列名がわかりません。)

テーブルを変更して列を追加すると、列が最後に表示されます。主キーにはかなり厄介だと思います。ただし、それを行う場合は、次のように更新できます。

with t as (select row_number() over (order by <CreatedAt>) as seqnum, t.*
           from t
          )
update t
    set newtID = seqnum
于 2012-07-19T20:16:07.583 に答える