0

Oracleテーブルに新しい値を挿入したい。テーブルは非常に大きく、IDコードは数字として保存されます。新しい情報を追加し、まだ取得されていないIDを自動的に割り当てることができる挿入ステートメントを作成したいと思います。

例えば:

insert into example_table values
(
(select max(person_id)+1 from example_table),
99, 'example name', 'example type');

しかし、ID(99)を指定しているため、上記のコードは明らかに機能しません。上記のコードスニペットで99をnullに設定した場合、それは機能しますか?フォーマット方法がわからない。

ありがとう。

4

2 に答える 2

3

これは間違ったアプローチです。スケーリングせず、マルチユーザー環境では機能しません。

どうやら、Oracle 12cは、MSSQLと同じようにAUTOINCREMENTを備えています。それまでの間、シーケンスを作成して代わりに使用する必要があります。

insert into example_table 
values ( person_id_seq.nextval, 'example name', 'example type')

詳細をご覧ください。

于 2012-10-19T10:20:13.580 に答える
1

これを行うには、データベーステーブルでシーケンスとトリガーを定義します。シーケンスは、IDを順番に販売するだけです。行が挿入されるとトリガーが起動し、シーケンスに次に使用可能なIDを要求し、それがテーブルに配置されます。このように、NULLを渡すと問題なく機能します。

CREATE SEQUENCE YOUR_SCHEMA_NAME.IDSEQ
  START WITH 9988
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER;

CREATE OR REPLACE TRIGGER YOUR_SCHEMA_NAME.YOUR_TABLE_NAME_bir
BEFORE INSERT
ON YOUR_SCHEMA_NAME.YOUR_TABLE_NAME REFERENCING NEW AS NEW
FOR EACH ROW

BEGIN

  -- Custom code to: generate primary key from idseq if no id is passed

  IF :NEW.id IS NULL THEN
    :NEW.id := idseq.NEXTVAL;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    raise_application_error(-20570, 'System error: ' || SQLCODE || ':' || SQLERRM, TRUE);
END;
/
于 2012-10-19T10:16:51.627 に答える