みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

uniqueキーをupdateで+1するとERROR 1062: Duplicate entry になる

create table table1 (
a tinyint unsigned not null,
b tinyint unsigned not null,
unique index_table1 ( a, b )
);
insert into table1 values('1','1');
insert into table1 values('1','2');

update table1 set b = b+1 where a = '1';

とすると、
ERROR 1062: Duplicate entry '1-2' for key 1
とエラーになってしまいます。
どうやら unique の制約に引っかかっているみたいです。
結果としては
1,2
1,3
になればいいのですが、一個一個bが多い順番にSQLを発行するか、unique 制約を外すしかないんでしょうか?
(面倒なので、一発でやりたいのです)

投稿日時 - 2006-12-15 18:54:01

QNo.2603737

すぐに回答ほしいです

質問者が選んだベストアンサー

そもそもが、unique属性をつけているフィールドを
インクリメントするという運用方法がまちがっているのでは?
unique値は入力時に仕様が確定していて当然ですので
あとから変更して値がかぶる可能性があるような作り方は
するべきではありません。

もし非常にイレギュラーな処理として、今回の作業が発生したという
のであれば、ご自身でも指摘されている通り、uniqueをはずして
変更してからuniqueをつけなおすというやり方が妥当でしょう。

投稿日時 - 2006-12-16 10:31:27

お礼

回答ありがとうございます。
やはり仕様を考え直したほうがいいのでしょうか。

今回のことは、ユーザーにテーブルをいじらせるためのものです。

<table>
<tr><td>1-1</td><td>1-2</td></tr>
<tr><td>2-1</td><td>2-2</td></tr>
</table>
とあり、1-1には「あ」という文字があるとします。
ユーザーには一列目などにセルを入れることができるようにすることを目的にしています。
<table>
<tr><td>1-1</td><td>1-2</td></tr>
<tr><td>x-1</td><td>x-2</td></tr>
<tr><td>2-1</td><td>2-2</td></tr>
</table>
このような挿入を許可するために、元の2-1、2-2を3-1、3-2として値を変更しようとして質問のようなものになりました。
このため、同じ値に書き込ませないためにunique属性をつけています。
多分仕様的に難しいのかもしれませんね。

とりあえず、移動するものを一つ一つ指定するような形では動くようにしましたが、
他に良いやり方がありましたら教えてください。
よろしくお願いします。

投稿日時 - 2006-12-16 10:46:06

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

MySQL は UPDATE でも ORDER BY 句が使用できます。
バージョン3.23.38のドキュメントにも記述されているので、質問者さんの環境でも使用できるのでは。

投稿日時 - 2006-12-16 15:23:02

お礼

回答ありがとうございます。

update table1 set b = b+1 where a = '1' order by b desc;

として試しましたが、
ERROR 1064: You have an error in your SQL syntax near 'order by `b` desc' at line 1
とエラーが出てしまいました。

できるかと思ったのに残念です。

投稿日時 - 2006-12-16 20:03:18

ANo.1

MySQLのバージョンは何ですか?
MySQL 5.0移行なら、ストアドプロシジャを活用できます。

投稿日時 - 2006-12-15 19:12:12

補足

すいません。バージョンを書くのを忘れてました。
3.23.58ですので、ストアドプロシージャは使用できません。

投稿日時 - 2006-12-16 10:35:35

あなたにオススメの質問