1

このクエリを実行する必要があります:

SELECT MAX(col1) FROM table1;
INSERT INTO table1 (col1) VALUES (@someting);

@something はどこにありますかMAX(col1) + 1。クエリの作成を手伝ってもらえますか? NULL値でもクエリが機能する必要があります...キャストが必要だと思います。

これは drupal のようなテーブルです。col0 は AUTO_INCREMENT ですが、col1 は多くの理由でできません。

col0 が主キーで、auto_increment がアクティブです。ただし、バージョン ID として vid を使用します。新しいレコードを挿入せずにこれをインクリメントする必要があり、スレッドセーフなクエリが必要です。

4

1 に答える 1

6

これには変数は必要ありません。INSERT INTO ... SELECT 次のステートメントを使用できます。

INSERT INTO table1 (col1)
  SELECT MAX(col1) + 1 FROM table1

is の場合に 1 を返すことでこれを機能させる必要がある場合MAX(col1)NULL、次を使用しCOALESCE()ます。

INSERT INTO table1 (col1)
  SELECT COLAESCE(MAX(col1) + 1, 1) FROM table1

注: コメントで述べたように、増分列を作成しようとしている場合は、これを行わないでください。AUTO_INCREMENT代わりに、競合状態から安全な適切なを使用してください。

コメント後の更新:

コメントにあるものは、質問とは大きく異なります。VALUES()そこにある構文は無効であり、キーワードと括弧で囲まれたグループを持つべきではありません。代わりに、次のようにします。

INSERT INTO node (vid, type, uid, title, created, changed, status, promote, sticky)
  SELECT
    COALESCE(MAX(vid) + 1, 1),
    'node',
    1,
    'title', 
    1,1,1,1,1
  FROM node

の適切な自動インクリメント列定義vidは、それが主キーであると仮定すると、次のようになります。

vid INT NOT NULL PRIMARY KEY AUTO_INCREMENT

上記を使用すると、行う必要はありませんMAX(vid) + 1

于 2012-05-15T18:15:52.000 に答える