12

多くのユーザーを含む単一のテーブルがあります。そのテーブルには、user_id(INT)という列があります。これは、ユーザーごとに個別にインクリメントする必要があります。user_idは1から開始する必要があります

簡単な例を用意しました。

Showing all names
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+


Showing only where name = Bob
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 2            | Bob                   |
| 3            | Bob                   |
+--------------+-----------------------+

次のクエリはこれを実行しますが、「Bob」がテーブルにすでに存在する場合にのみ機能します...

INSERT INTO users(user_id, name) SELECT(SELECT MAX(user_id)+1 from users where 
name='Bob'), 'Bob';

ボブが存在しない場合(最初のエントリ)、user_idは0(ゼロ)に設定されます。これが問題です。user_idを0ではなく1から開始する必要があります。

4

4 に答える 4

17

次のようなものを使用できます。

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

しかし、そのようなクエリは競合状態につながる可能性があります。トランザクションを実行していることを確認し、実行する前にユーザーテーブルをロックしてください。そうしないと、同じ番号の2人のボブになってしまう可能性があります。

于 2009-10-19T08:47:32.113 に答える
6

IFNULLを使用できます:

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';
于 2009-10-19T08:43:37.250 に答える
3

MySQL のバグとして報告されています。

私はギレム・ビショーを引用しています:

次に、最も簡単な回避策があります: insert into foo(lfd) values((select max(lfd) from foo)+1)
を使用する代わりに、 insert into foo( lfd ) select (max(lfd)+1) を実行します。フーから;


于 2010-01-02T14:52:03.160 に答える
1

その場合、MAX()+1を使用しないでください。テーブルで自動番号付けスキームを使用します。

質問をきちんと読んでいませんでした。グレッグのIFNULL()の提案を使用してください。

于 2009-10-19T08:40:40.177 に答える