データがある既存のテーブルに新しい自動増分プライマリ列を追加したいと思います。それ、どうやったら出来るの?
最初に列を追加し、その後シーケンスを追加しようとしましたが、その列を主キーとして挿入して作成する方法を失いました。
データがある既存のテーブルに新しい自動増分プライマリ列を追加したいと思います。それ、どうやったら出来るの?
最初に列を追加し、その後シーケンスを追加しようとしましたが、その列を主キーとして挿入して作成する方法を失いました。
テーブルが呼び出されt1
、主キーが呼び出されたとします。id
まず、シーケンスを作成します。
create sequence t1_seq start with 1 increment by 1 nomaxvalue;
次に、挿入時に増分するトリガーを作成します。
create trigger t1_trigger
before insert on t1
for each row
begin
select t1_seq.nextval into :new.id from dual;
end;
列とシーケンスがある場合は、最初に既存のすべての行に新しいキーを入力する必要があります。どのキーがどの行に割り当てられているかは気にしないと仮定します
UPDATE table_name
SET new_pk_column = sequence_name.nextval;
それが完了したら、主キー制約を作成できます(これは、既存の主キー制約がないか、既存の主キー制約をすでに削除していることを前提としています)
ALTER TABLE table_name
ADD CONSTRAINT pk_table_name PRIMARY KEY( new_pk_column )
キーを自動的に生成する場合は、トリガーを追加する必要があります
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
:new.new_pk_column := sequence_name.nextval;
END;
古いバージョンのOracleを使用している場合、構文は少し面倒です。
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
SELECT sequence_name.nextval
INTO :new.new_pk_column
FROM dual;
END;
OracleOTNフォーラムからの引っ掛かり
次のように、altertableを使用して列を追加します。
alter table tableName add(columnName NUMBER);
次に、シーケンスを作成します。
CREATE SEQUENCE SEQ_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999
MINVALUE 1
NOCYCLE;
そして、update
このように列に値を挿入するために使用します
UPDATE tableName SET columnName = seq_test_id.NEXTVAL
Oracle Data Modelerを使用して、自動インクリメントの代理キーを作成できます。
ステップ1.-リレーショナル図を作成する
最初に論理図とエンジニアを作成してリレーショナル図を作成するか、すぐにリレーショナル図を作成することができます。
PKを自動インクリメントするために必要なエンティティ(テーブル)を追加し、PKのタイプを整数として選択します。
手順2.-PK列のプロパティを編集する
PK列のプロパティを取得します。列の名前をダブルクリックするか、[プロパティ]ボタンをクリックします。
[列のプロパティ]ダイアログボックスが表示されます。
[全般]タブ(初めてのデフォルト選択)を選択します。次に、[自動インクリメント]チェックボックスと[ID列]チェックボックスの両方を選択します。
ステップ3.-追加情報
自動増分に関する追加情報は、[自動増分]タブを選択して指定できます。
PL / SQLで役立つように、通常はシーケンス名を指定することをお勧めします。
[列のプロパティ]ダイアログボックスで[OK]([適用])をクリックします。
[テーブルのプロパティ]ダイアログボックスで[OK]([適用])をクリックします。
表がリレーショナル図に表示されます。