web-dev-qa-db-ja.com

MySQLでシーケンスを作成するにはどうすればよいですか?

MySQLでシーケンスを作成しようとしています(SQL全体としては非常に新しいです)。次のコードを使用していますが、エラーが発生します。

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;

ORDIDは、使用しているテーブル内のフィールドを参照します。シーケンスを適切に作成するにはどうすればよいですか?

編集:

伝えられるところでは、MySQLはシーケンスを使用しません。現在、次のコードを使用していますが、これもエラーの原因です。どうすれば修正できますか?

CREATE TABLE ORD (
ORDID NUMERIC(4) NOT NULL AUTO_INCREMENT START WITH 622,
//Rest of table code

編集:

修正が見つかったと思います。 phpMyAdmin(私が使用していた)には、次のコードを使用できます。

ALTER TABLE ORD AUTO_INCREMENT = 622;

私はそれがなぜこれを好むのか分かりませんが、他の誰かがこれで助けを必要とするなら、ここに行きます。 :)

18
Ben

この記事 をご覧ください。欲しいものを手に入れるのに役立つはずだと思います。テーブルが既に存在し、その中にデータが既にある場合、他のレコードに既に存在する値をauto_incrementが割り当てようとしていることが原因である可能性があります。

要するに、他の人がすでにコメントで言及しているように、Oracleで考えられ処理されているシーケンスは、MySQLには存在しません。ただし、auto_incrementを使用して、目的を達成することができます。

特定のエラーに関する追加の詳細がなければ、より具体的なヘルプを提供することは困難です。

[〜#〜] update [〜#〜]

CREATE TABLE ORD (
  ORDID INT NOT NULL AUTO_INCREMENT,
  //Rest of table code
  PRIMARY KEY (ordid)
)
AUTO_INCREMENT = 622;

このリンク は、auto_incrementの使用法を説明するのにも役立ちます。 AUTO_INCREMENT値の設定は、 テーブルオプション であり、列属性として具体的に指定されたものではないようです。

また、上記のリンクの1つにつき、代わりにテーブルの変更を介して自動インクリメント開始値を設定できます。

ALTER TABLE ORD AUTO_INCREMENT = 622;

UPDATE 2以下に、自動インクリメントを使用した 実際のsqlfiddleの例 へのリンクを示します。
この情報がお役に立てば幸いです。

23
Daileyo

これは解決策です MySQlマニュアルで推奨

ExprがLAST_INSERT_ID()の引数として指定されている場合、引数の値は関数によって返され、LAST_INSERT_ID()によって返される次の値として記憶されます。これは、シーケンスをシミュレートするために使用できます。

シーケンスカウンターを保持するテーブルを作成し、初期化します。

    mysql> CREATE TABLE sequence (id INT NOT NULL);
    mysql> INSERT INTO sequence VALUES (0);

テーブルを使用して、次のようなシーケンス番号を生成します。

    mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
    mysql> SELECT LAST_INSERT_ID();

UPDATEステートメントはシーケンスカウンターをインクリメントし、LAST_INSERT_ID()の次の呼び出しで更新された値を返します。 SELECTステートメントはその値を取得します。 mysql_insert_id()C API関数を使用して値を取得することもできます。セクション23.8.7.37「mysql_insert_id()」を参照してください。

LAST_INSERT_ID()を呼び出さずにシーケンスを生成できますが、この方法で関数を使用することの有用性は、ID値が最後に自動生成された値としてサーバーに保持されることです。複数のクライアントがUPDATEステートメントを発行し、独自のシーケンス値を生成する他のクライアントに影響を与えたり影響を受けたりすることなく、SELECTステートメント(またはmysql_insert_id())で独自のシーケンス値を取得できるため、マルチユーザーに対して安全です。

30
pupitetris

増分テーブルを作成することにより、挿入された行を削除しないように注意する必要があります。これは、ID-sを含むdbに大きなダムデータを保存しないようにするためです。それ以外の場合、mysqlの再起動の場合、既存の最大行を取得し、ドキュメントで言及されているようにその時点からインクリメントを継続します http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment- handling.html

3
Dato Janez

AUTO_INCREMENTとは異なるsthが必要な場合でも、トリガーを使用できます。

0
Marek Lisiecki