- 締切済み
データが更新されません
Access2002です。 「DVDNum」テキスト型 インデックス はい (重複あり) 「ID」長整数型 はい (重複あり) の2列で構成されているテーブル「DVDinfo」があります このデータで DVD-01 1 DVD-01 2 DVD-01 3 DVD-02 4 DVD-02 5 DVD-03 6 DVD-03 7 DVD-03 8 DVD-04 9 ・・・ (IDの列は飛び数字はありません) の状態で新規に DVD-02 6 を入れたいのです ただしIDは上記のように連番にしたいので まず先にInsert前の6以降を全部+1してから 新しいデータを挿入しようと考えました。 そのUPDATE文は UPDATE DVDinfo SET ID = ID + 1 WHERE 収録ID >= 6; としたのですが、実行しようとすると エラー「更新クエリですべてのレコードを更新できません ・・・2件のレコードでキー違反、・・・レコードを更新できませんでした」 とでます。 DVD-03 6 ・・・A DVD-03 7 ・・・B DVD-03 8 ・・・C で恐らく6が7になろうとしBと重なる、7が8になろうとしCと重なる の2件がキーに違反するって言うことだと思います。 私の目的はある値から指定した分値を増やしたいのですが この場合はSQLを直すのかデータの構造が直すのか 教えて欲しいです。 最終的に DVD-01 1 DVD-01 2 DVD-01 3 DVD-02 4 DVD-02 5 DVD-02 6 DVD-03 7 DVD-03 8 DVD-03 9 DVD-04 10 ・・・ となって欲しいのです よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- CHRONOS_0
- ベストアンサー率54% (457/838)
やろうとしていることがデータベース的ではないですね IDというからにはこれはレコードを特定するものであり AccessのようなRDBなら他のテーブルと関係づけるために 設けられているもののはずです そのようなものをレコードが増えたからと言って振り替えるなんてのは データベース的には絶対にやってはならない操作です そうではなく単なるお飾りだというのなら テーブルには持たずにクエリなどで表示の都度振ってやればいいだけの話になりますね
- bonaron
- ベストアンサー率64% (482/745)
DAO の例です。 DAO 3.6 の参照設定 が必要です Dim rst As DAO.Recordset Dim strSQL As String strSQL = "SELECT ID From テーブル名" & _ " WHERE ID >=6" & _ " ORDER BY ID DESC" Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) If rst.RecordCount > 0 Then rst.MoveFirst Do Until rst.EOF rst.Edit rst!ID = rst!ID + 1 rst.Update rst.MoveNext Loop End If rst.Close Set rst = Nothing のような感じですね。 >=6 や +1 の数字はフォームのテキストボックスを参照するようにするのが普通かな?
- bonaron
- ベストアンサー率64% (482/745)
UPDATE DVDinfo SET ID = ID + 10000001 WHERE 収録ID >= 6; を実行してから UPDATE DVDinfo SET ID = ID - 10000000 WHERE 収録ID > 6; を実行すればよろしいのでは? 10000000 は 長整数型の範囲で、ありえない十分大きい数で。 あるいは、DAO などで 大きい順に読み、+1するかですね。
お礼
>UPDATE DVDinfo SET ID = ID + 10000001 WHERE 収録ID >= 6; を実行してから UPDATE DVDinfo SET ID = ID - 10000000 WHERE 収録ID > 6; を実行すればよろしいのでは? そうですね。たしかにそんな値まではデータはたまらないですね。 >あるいは、DAO などで 大きい順に読み、+1するかですね。 そのやり方のヒントがあれば教えてください
お礼
御回答ありがとうございます " ORDER BY ID DESC" ですね。 やってみます