2012-01-16 9 views
-1

重複しているエントリエラーに遭遇したとしても、プライマリキーを増やしたくない!MySQLでは、「重複エントリ」エラーが発生した場合、主キーの自動インクリメントを防ぐにはどうすればよいですか?

+1

なぜインクリメントを防止したいのですか?あなたが数字の隙間を心配しているなら、間違ったトラックにいます。 –

+0

TIMEXあなたは素晴らしい評価をしています。この問題についてもう少し背景を教えてください。そうでなければ、あなたのニーズに合わない多くの回答が得られるでしょう。 –

答えて

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カラムの使用を不適格とするので、この動作が気に入らないようにしてください。

私の解決策は:それを追加する前に一意のキーが存在するかどうかをチェックして、一意のキーから辞めることです。

関連する問題