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 制約を外すしかないんでしょうか?
(面倒なので、一発でやりたいのです)
No.2ベストアンサー
- 回答日時:
そもそもが、unique属性をつけているフィールドを
インクリメントするという運用方法がまちがっているのでは?
unique値は入力時に仕様が確定していて当然ですので
あとから変更して値がかぶる可能性があるような作り方は
するべきではありません。
もし非常にイレギュラーな処理として、今回の作業が発生したという
のであれば、ご自身でも指摘されている通り、uniqueをはずして
変更してからuniqueをつけなおすというやり方が妥当でしょう。
回答ありがとうございます。
やはり仕様を考え直したほうがいいのでしょうか。
今回のことは、ユーザーにテーブルをいじらせるためのものです。
<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属性をつけています。
多分仕様的に難しいのかもしれませんね。
とりあえず、移動するものを一つ一つ指定するような形では動くようにしましたが、
他に良いやり方がありましたら教えてください。
よろしくお願いします。
No.3
- 回答日時:
MySQL は UPDATE でも ORDER BY 句が使用できます。
バージョン3.23.38のドキュメントにも記述されているので、質問者さんの環境でも使用できるのでは。
回答ありがとうございます。
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
とエラーが出てしまいました。
できるかと思ったのに残念です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
SQLについて教えて下さい with(...
-
JOINで1つのテーブルに空白があ...
-
SQLでフィールドの順番を変更し...
-
DB2でのロック
-
SQL Server 2005 Express で CD...
-
SQLServerでの切り上げ処理
-
SQL server改行コード
-
count集計の結果が0の場合でも...
-
「重複を間引いた数」をcountし...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
SQLで特定の項目の重複のみを排...
-
EXISTSを使ったDELETE文
-
エクセルで最後の文字だけ置き...
-
処理件数を非表示にしたい
-
SELECT 文 GROUP での1件目を...
-
1日に1人がこなせるプログラム...
-
SQL Date型の列から年月だけを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
SQLについて教えて下さい with(...
-
count集計の結果が0の場合でも...
-
SQLでフィールドの順番を変更し...
-
JOINで1つのテーブルに空白があ...
-
SQLServerでの切り上げ処理
-
'internal' のシステム メモリ...
-
自作関数の方がパフォーマンス...
-
SQL server改行コード
-
グループ毎の最大値を持つデー...
-
SQL Server 2005 Express で CD...
-
「重複を間引いた数」をcountし...
-
MySQLで複数のSELECT文を1文に...
-
DB2でのロック
-
Unionの結果全体をOrder By し...
-
mysqlのalter table中のロック...
-
md5で暗号化して別フィールドに...
-
SQLを作ったのですがうまくいき...
-
uniqueキーをupdateで+1するとE...
-
差し込み後、元データを変更し...
おすすめ情報