MySQLでシーケンスを作成しようとしています(SQL全体の経験は浅いです)。以下のコードを使用していますが、エラーが発生します。
CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;
ORDIDは私が使用しているテーブルのフィールドを参照しています。どうすれば適切にシーケンスを作成できますか?
Edit:
聞くところによると、MySQLはシーケンスを使用していないとのこと。現在、以下のコードを使用していますが、これもエラーを引き起こしています。どうすれば直るのでしょうか?
CREATE TABLE ORD (
ORDID NUMERIC(4) NOT NULL AUTO_INCREMENT START WITH 622,
//Rest of table code
Edit:
修正方法を見つけたようです。私が使用していた)phpMyAdminでは、以下のコードを使用できます。
ALTER TABLE ORD AUTO_INCREMENT = 622;
なぜこのようなコードを好むのかはわかりませんが、もし他の人がこの件で助けを必要としているならば、どうぞ。)
これは[MySQlのマニュアルで提案されている]解決策です1。
LAST_INSERT_ID()の引数にexprが与えられた場合、引数の値が関数から返され、次の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()を呼び出さなくても、シーケンスを生成することはできますが LAST_INSERT_ID()を呼び出さずにシーケンスを生成することもできますが、この方法で関数を使用することの有用性は、IDの値が 最後に自動生成された値としてサーバーに保持されます。これは 複数のクライアントがUPDATE文を発行して自分のIDを取得できるので、マルチユーザーセーフです。 ステートメントを発行し、SELECT ステートメントで自分のシーケンス値を取得することができるため、マルチユーザーセーフです。 複数のクライアントがUPDATEステートメントを発行し、SELECTステートメント(またはmysql_insert_id())で独自のシーケンス値を取得しても、他の 複数のクライアントがUPDATE文を発行し、SELECT文で独自のシーケンス値を取得することができるため、マルチユーザーセーフとなります。
この記事]1をご覧ください。 お望みのものが得られると思います。 テーブルが既に存在し、データが入っている場合、エラーが発生するのは、auto_incrementが他のレコードに既に存在する値を割り当てようとしていることが原因かもしれません。
つまり、他の方のコメントにもあるように、Oracleで考えられているシーケンスは、MySQLには存在しません。 しかし、auto_incrementを使用して希望することを実現できる可能性があります。
具体的なエラーの詳細がわからなければ、より具体的なヘルプを提供することは困難です。
更新情報 (英語)
CREATE TABLE ORD (
ORDID INT NOT NULL AUTO_INCREMENT,
//Rest of table code
PRIMARY KEY (ordid)
)
AUTO_INCREMENT = 622;
auto_incrementの使い方については、このリンクも参考になります。 AUTO_INCREMENTの値を設定することは、[テーブルのオプション][3]であり、特にカラムの属性として指定されるものではないようです。
また、上記のリンクの1つによると、テーブルに変更を加えることで、自動増分の開始値を設定することもできます。
ALTER TABLE ORD AUTO_INCREMENT = 622;
アップデイト2。
自動増分を使用したsqlfiddleの動作例へのリンクを示します。
この情報がお役に立てれば幸いです。
[3]: http://dev.mysql.com/doc/refman/5.0/en/create-table.html
インクリメントテーブルを作成する際には、挿入された行を削除しないように注意する必要があります。その理由は、IDを含む大量のダムデータをデータベースに保存しないためです。そうしないと、ドキュメント http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html にあるように、mysql が再起動した場合、既存の最大行を取得し、その時点からインクリメントを続けることになります。