2015-01-09 25 views
7

OracleのシーケンスとMySqlのauto_incrementの違いを完全に理解していません。Oracleの「シーケンス」とMySqlのAuto_increment機能の違いは何ですか?

私はmysqlの男ですが、oracleのことは何も知りません。私は誰かが私のためにこれについて迅速な光を照らすことができることを望んでいます。事前に

おかげで、 ダン・ボーマン

+0

シーケンスはプライマリキーの列ではなくルールに似ています – Mihai

+0

すぐに:*非常に重要な違いがあります:AUTO_INCREMENTは単一のテーブルの列に結び付けられます。 Oracle SEQUENCEはそうではありません。データベースの再起動時に、InnoDBテーブルに対して、AUTO_INCREMENTは最も高いカラム値にリセットされます。 Oracle SEQUENCEはそうではありません。 Oracle SEQUENCEオブジェクトは、完全に独立したオブジェクトであり、低い競合/高い並行性で一意の値を生成するように設計されています。 (SEQUENCEとBEFORE INSERTトリガを使用してMySQL AUTO_INCREMENTをエミュレートすることは可能ですが、「終わりに」Oracle SEQUENCEはAUTO_INCREMENTとほとんど似ていません)。 – spencer7593

+0

質問:「OracleでMySQLスタイルのAUTO_INCREMENTをエミュレートできますか? ? "その質問に対する答えは「はい」です。質問が違いについてのものであれば... Oracleのシーケンス:下限と上限を持つことができます;インクリメントに負の値を持つことができます;ラップできます(上限に達した後、新しい値はSELECT文で取り出すことができ、INSERTを必要とせず、単一のシーケンスは多数の異なるトリガ、関数、プロシージャによって使用でき、任意のテーブルから独立して削除/再作成でき、SEQUENCEの値はデータベースを再起動しても保持されます。 – spencer7593

答えて

9

シーケンスはOracleのデータベースオブジェクトです。

MySQLでは、自動インクリメント列があり、テーブルに新しい行を挿入すると、自動インクリメント列は言及されず、MySQLはそこに置きます。 LAST_INSERT_ID()を参照して、同じ番号を別のテーブルに挿入することができます。

INSERT INTO person (name, date)        /*MySQL*/ 
       VALUES ('joe', '2015-01-01'); 
INSERT INTO contact (person_id, phone) 
       VALUES (LAST_INSERT_ID(), '555-1212'); 

は、Oracleでは、シーケンスオブジェクトのプロパティ.nextvalを言及することにより、id列を移入することができます。 .currvalプロパティを参照することによって、そのシーケンスの使用価値を得ることができます。

INSERT INTO person (id, name, date)       -- Oracle 
        VALUES (person_seq.nextval, 'joe', '2015-01-01'); 
INSERT INTO contact (id, person_id, phone) 
        VALUES (contact_seq.nextval, person_seq.currval, '555-1212'); 

あなたはシーケンスの.nextvalプロパティを言及するたびに、新しい番号を与えることを保証しています。

シーケンスオブジェクトは、テーブルなどの主キーに直接関連しない一意の番号が必要な場合には非常に便利です。あなたは、MySQLでこれを行うことができますが、それはその場しのぎです:あなたは、次の表を作成する場合:

CREATE TABLE sequence (          /*MySQL*/ 
    sequence_id BIGINT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`sequence_id`) 
) 

そして、これらの3件の問い合わせ次々発行:第三クエリが返すことが保証されて

INSERT INTO sequence() VALUES();       /*MySQL*/ 
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID(); 
SELECT LAST_INSERT_ID() AS sequence; 

を固有のシーケンス番号。この保証は、データベースに数十種類の異なるクライアントプログラムが接続されている場合でも保持されます。 (DELETEクエリが単にあまりにも多くのスペースを取ってから、このそうでない場合は無意味なテーブルを保持します。)

をオラクルを使用すると、シーケンス

create sequence seq           --Oracle 

を作成してからちょうど得るために

SELECT seq.nextval FROM DUAL         --Oracle 

を行います新しいシーケンス番号とそれはそれです。数十の接続されたクライアントプログラムでも一意性が保証されます。

同様に、.nextvalで生成したシーケンスの値が必要な場合は、このコマンドを発行して取得できます。 MySQLのLAST_INSERT_ID()と同様に

SELECT seq.currval FROM DUAL         --Oracle 

、これはそうシーケンスを使用して別のクライアントがあなたの代わりにあなたの自分の番号を取得することはありませんセッションでセッションを処理されます。

ボトムライン:両方のDBMSが一意の整数を生成できます。両方のスキームの完全性は、サーバー停止と再起動の間に保持されるように設計されています。 Oracleの順序はより柔軟です。

+0

セイコーエプソンが選ぶことができることに注目する価値があるかもしれません。SELECT seq.currval FROM dual '(しかし、' nextval'のために照会された後にのみ)、そのセッションによって生成された最後のシーケンス番号を取得します。 –

+0

@DavidFaber、良い提案、ありがとう、私は私の答えを編集しました。 –

+0

これはMySQLにとって素晴らしいテクニックです。制御テーブルにシーケンスを保持しようとするよりはるかに優れています。提案していただきありがとうございます。 – Stenerson

0

は、Oracleは自動インクリメント列を持っていません。シーケンスを作成する必要があります。シーケンスのNEXTVALを読み込んでトリガーを挿入し、列の値を設定する前に、

を入力してください。
+0

だから、終わりに機能は同じです - シーケンスはauto_incrementより強力ではありませんか? –

+1

はいあなたはoracleにいるので、テーブルの任意の数値列に余分な詳細を入れて、自動インクリメントにする必要があります。 – Mobitips

+1

@DanielBaughman:あなたのテイクアウトが「**機能は同じです**」とすると、これは貧弱な答えで​​す。彼らは基本的に* different *ですが、いくつかの*重要な違いがあります。 (この回答が指摘しているように、Oracle内のMySQLのようなAUTO_INCREMENTをエミュレートすることは可能ですが、エミュレーションではSEQUENCEオブジェクトを有効に使用できますが、Oracle SEQUENCEはAUTO_INCREMENTだけではありません。 – spencer7593

3

Oracle DB内のシーケンスは、クエリでアクセスしてその値を取得/増分することができる別個のエンティティであり、複数のテーブル/フィールドで同じシーケンスを使用できます。

MySQLの自動インクリメントは、テーブル内の1つのフィールドにバインドされ、挿入クエリで指定されていないときにそのフィールドの値を定義するために使用されます。

+1

"理論的に"複数のテーブルに対して同じSEQUENCEを使うことができるだけでなく、実際にはそうしています。 – spencer7593

+0

@ spencer7593説明をお寄せいただき、ありがとうございました。私はOracleに多くの経験がありません。 –

関連する問題