重複しているエントリエラーに遭遇したとしても、プライマリキーを増やしたくない!MySQLでは、「重複エントリ」エラーが発生した場合、主キーの自動インクリメントを防ぐにはどうすればよいですか?
-1
A
答えて
1
あなたがテーブルを使用して、シーケンスなどの神託を実装するためにトリガーできます
drop table if exists users_seq;
create table users_seq
(
next_val int unsigned not null default 0
)
engine=innodb;
drop table if exists users;
create table users
(
user_id int unsigned not null,
username varchar(32) unique not null
)
engine=innodb;
delimiter #
create trigger users_before_ins_trig before insert on users
for each row
begin
declare v_id int unsigned default 0;
select next_val + 1 into v_id from users_seq;
set new.user_id = v_id;
update users_seq set next_val = v_id;
end#
delimiter ;
insert into users_seq values (0);
insert into users (username) values ('alpha'),('beta');
Query OK, 2 rows affected, 1 warning (0.03 sec)
select * from users_seq;
+----------+
| next_val |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
select * from users;
+---------+----------+
| user_id | username |
+---------+----------+
| 1 | alpha |
| 2 | beta |
+---------+----------+
2 rows in set (0.00 sec)
insert into users (username) values ('alpha');
ERROR 1062 (23000): Duplicate entry 'alpha' for key 'username'
select * from users_seq;
+----------+
| next_val |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
select * from users;
+---------+----------+
| user_id | username |
+---------+----------+
| 1 | alpha |
| 2 | beta |
+---------+----------+
2 rows in set (0.00 sec)
insert into users (username) values ('gamma');
Query OK, 1 row affected, 1 warning (0.03 sec)
select * from users_seq;
+----------+
| next_val |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
select * from users;
+---------+----------+
| user_id | username |
+---------+----------+
| 1 | alpha |
| 2 | beta |
| 3 | gamma |
+---------+----------+
3 rows in set (0.00 sec)
は、それが:)
1
答えはあなたの質問に含まれています。単純に自動インクリメント列にしないでください。代わりに、自分自身で正しい値を見つけ出し、重複したキーエラーを処理します。
0
フィールドをAUTO_INCREMENTのないPRIMARYに設定するだけで、その値を制御できます。
0
はちょうどこの「バグ」に出くわしたのに役立ちます願っています。私のアプリケーションのUNIQUEカラムの使用を不適格とするので、この動作が気に入らないようにしてください。
私の解決策は:それを追加する前に一意のキーが存在するかどうかをチェックして、一意のキーから辞めることです。
関連する問題
- 1. 防止自動インクリメントをスキップで重複したキーを更新
- 2. データベーステーブルにデータをアップロードして重複するエントリを防ぐにはどうすればよいですか?
- 3. ItemCountの重複を防ぐにはどうすればよいですか?
- 4. JavaFXテストプロジェクトで重複を防ぐにはどうすればいいですか
- 5. Mysql主キーの重複エントリ(AUTO_INCREMENT)
- 6. 送信中にエラーが発生した場合、Djangoフォームフィールドをリセットまたはクリアするのを防ぐにはどうすればいいですか?
- 7. エラーが発生した場合、async.waterfallを再起動するにはどうすればよいですか?
- 8. どのようにmysqlに重複レコードを防ぐには?
- 9. AppleScriptの自動ダイアログボックスを防ぐにはどうすればいいですか?
- 10. 汎用クラスの生成コードの重複を防ぐにはどうすればよいですか?
- 11. テーブルを重複した主キーで更新するにはどうすればよいですか?
- 12. Eclipse(3.4):エラーが発生した場合に問題が自動的に表示されるようにするにはどうすればよいですか?
- 13. MySQL:キーの重複エントリ(以前は「idxはどういう意味ですか?」)
- 14. FxCopが自動生成コードを解析するのを防ぐにはどうすればいいですか?
- 15. 同じ主キーで複数のDynamoDBエントリを作成するにはどうすればよいですか?
- 16. PHPで重複したフォーム提出を防ぐにはどうすればいいですか?
- 17. 重複キー更新時に自動インクリメントIDを更新しないようにするにはどうすればよいですか?
- 18. SQL - 主キー、クラスタードインデックス、自動インクリメント
- 19. 複合主キーの自動インクリメント - sqlite3の+ Pythonの
- 20. C#を使用して、テキストブロックの重複を防ぐにはどうすればよいですか?
- 21. SQL Server:主キーの自動インクリメント - 削除された行と空きキーの値はどうですか?
- 22. 主キーで重複したエントリを取得する
- 23. SQLite3 - データベースに重複したエントリが入るのを防ぐ
- 24. 特定の時間内に重複エントリを防止するにはどうすればよいですか?
- 25. nodejsによる重複要求を防ぐにはどうすればよいですか?
- 26. スクロールバーが自動的に上に戻るのを防ぐにはどうすればよいですか?
- 27. メディアクエリ内でCSSコードの重複を防ぐにはどうすればよいですか?
- 28. バニラジャバスクリプトのイベントリスナーで重複を防ぐにはどうすればよいですか?
- 29. Accessデータベースに重複するエントリを防止するにはどうすればよいですか?
- 30. リフレッシュ中に重複するエントリを防止するにはどうすればよいですか?
なぜインクリメントを防止したいのですか?あなたが数字の隙間を心配しているなら、間違ったトラックにいます。 –
TIMEXあなたは素晴らしい評価をしています。この問題についてもう少し背景を教えてください。そうでなければ、あなたのニーズに合わない多くの回答が得られるでしょう。 –