質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

5回答

1866閲覧

オラクルのシーケンスを1から挿入したい。

tkshp

総合スコア174

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2017/10/16 04:32

編集2017/10/16 04:44

###前提・実現したいこと
Oracleでシーケンスを1から挿入するにはどうしたらよいのでしょうか?
また、シーケンスとは、通常、1つのテーブルに対して、それ専用のシーケンスを1個作るのが基本なのでしょうか?

###試したこと

oracle

1CREATE TABLE SEARCH_KEYWORD ( 2 ID NUMBER NOT NULL, 3 KEYWORD VARCHAR2(120) NOT NULL, 4 DT DATE DEFAULT SYSDATE, 5 PRIMARY KEY(ID) 6)

oracle

1CREATE SEQUENCE search_key_seq 2START WITH 1 3INCREMENT BY 1 4NOMAXVALUE;

ここで、下記を実行するとシーケンスが2から挿入されます。

oracle

1INSERT INTO SEARCH_KEYWORD (ID, KEYWORD) VALUES(search_key_seq.nextval, 'キーワード');

しかし、最初だけ調整のためにシーケンス1で下記を実行すると、次に上記を実行した際に、
「一意制約に反しています」というエラーが出てしまいます。

oracle

1INSERT INTO SEARCH_KEYWORD (ID, KEYWORD) VALUES(1, 'キーワード');

また、下記で実行すると、次のようなエラーが出ます。

oracle

1CREATE SEQUENCE search_key_seq 2START WITH 0 3INCREMENT BY 1 4NOMAXVALUE;
START WITHにMINVALUEより小さい値は指定できません。

###補足情報(言語/FW/ツール等のバージョンなど)
Oracle

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

旧OTN-Japan の使えるCode Tips シーケンスの初期化/再設定
良く理解した上でお使いください。

投稿2017/10/16 05:26

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すでにシーケンスを参照して、値が1になっていませんか?

シーケンスの現在値の確認方法をググって、調べてみてください。

「一意制約に反しています」

これは、シーケンスの問題でなく、SEARCH_KEYWORDテーブルにすでにIDが1のデータが入っているから。
たぶん、このデータいれるときにシーケンス使ったので、初期値が違うのでは?

「START WITHにMINVALUEより小さい値は指定できません。」

エラーのままの意味です。
オラクルのCREATE SEQUENCEのリファレンスを調べてください。
MINVALUEの値を設定すれば良いかと。

その他

oracle 12c だと、テーブル定義時に自動で、sequence作ってくれる宣言があるようです。
CREATE TABLEのリファレンスを見てください。

この句を使用すると、ID列を作成できます。このID列には、それ以降のINSERT文ごとに、順序ジェネレータからの増加または減少する整数値が割り当てられます。identity_options句を使用すると、順序ジェネレータを構成できます。

投稿2017/10/16 05:16

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ついでですが、12c ですとこんなのもありますけどね。

SQL> create table search_keyword_12c ( 2 id number generated as identity not null, 3 keyword varchar2(120) not null, 4 dt date default sysdate, 5 primary key(id) 6 ); Table created. SQL> insert into search_keyword_12c (keyword) 2 values ('abcdef'); 1 row created. SQL> commit; Commit complete. SQL> select * from search_keyword_12c; ID ---------- KEYWORD -------------------------------------------------------------------------------- DT --------- 1 abcdef 16-OCT-17 SQL>

投稿2017/10/16 05:07

SugiTK

総合スコア495

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2017/10/16 05:11

ご回答ありがとうございます。 シーケンスの使い方についてですが、通常、1つのテーブルに対して、それ専用のシーケンスを1個作るのが基本なのでしょうか? シーケンスを使うテーブルごとに、個別にシーケンスを作っていくのが一般的でしょうか?
SugiTK

2017/10/16 05:14

毎回テーブルごとに明示的に作らなくてもよくなったというのがここで示した例なのですが。。 11g 以前では必要な分だけ作るというのが普通だったと思います。
tkshp

2017/10/16 06:04

ご回答ありがとうございます。 すみません、理解できてませんでした。 generatedとは、そういう意味だったのですね。 ありがとうございます。
guest

0

わたしも試しました。Oracle DB 12.1.0.1.0 です。

1からになりますね。

SQL> create table search_keyword ( 2 id number not null, 3 keyword varchar2(120) not null, 4 dt date default sysdate, 5 primary key(id) 6 ); Table created. SQL> create sequence search_key_seq 2 start with 1 3 increment by 1 4 nomaxvalue; Sequence created. SQL> insert into search_keyword (id, keyword) 2 values (search_key_seq.nextval, 'キーワード'); 1 row created. SQL> commit; Commit complete. SQL> select id from search_keyword; ID ---------- 1 SQL>

投稿2017/10/16 05:03

SugiTK

総合スコア495

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

START WITH 0

は試されましたか?

通常は質問に記載の対応で1から発番されるかとは思います。

投稿2017/10/16 04:36

編集2017/10/16 04:38
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2017/10/16 04:45

ご回答ありがとうございます。 試すと「START WITHにMINVALUEより小さい値は指定できません。」というエラーになりました。本文に追記しました。
tkshp

2017/10/16 04:58

すみません、同じことをもう1度やり直したら、今度は1番から発番されました。逆になぜ最初は2番から発番されたのか不明です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問