• 締切
  • すぐに回答を!

データが更新されません

  • 質問No.2504956
  • 閲覧数58
  • ありがとう数2
  • 回答数3

お礼率 81% (301/370)

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件)

  • 回答No.3

ベストアンサー率 54% (457/838)

やろうとしていることがデータベース的ではないですね
IDというからにはこれはレコードを特定するものであり
AccessのようなRDBなら他のテーブルと関係づけるために
設けられているもののはずです

そのようなものをレコードが増えたからと言って振り替えるなんてのは
データベース的には絶対にやってはならない操作です

そうではなく単なるお飾りだというのなら
テーブルには持たずにクエリなどで表示の都度振ってやればいいだけの話になりますね
  • 回答No.2

ベストアンサー率 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 の数字はフォームのテキストボックスを参照するようにするのが普通かな?
お礼コメント
tocci_pc

お礼率 81% (301/370)

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

" ORDER BY ID DESC"
ですね。

やってみます
投稿日時:2006/10/30 23:13
  • 回答No.1

ベストアンサー率 64% (482/745)

UPDATE DVDinfo SET ID = ID + 10000001
WHERE 収録ID >= 6;
を実行してから
UPDATE DVDinfo SET ID = ID - 10000000
WHERE 収録ID > 6;
を実行すればよろしいのでは?
10000000 は 長整数型の範囲で、ありえない十分大きい数で。

あるいは、DAO などで 大きい順に読み、+1するかですね。
お礼コメント
tocci_pc

お礼率 81% (301/370)

>UPDATE DVDinfo SET ID = ID + 10000001
WHERE 収録ID >= 6;
を実行してから
UPDATE DVDinfo SET ID = ID - 10000000
WHERE 収録ID > 6;
を実行すればよろしいのでは?

そうですね。たしかにそんな値まではデータはたまらないですね。

>あるいは、DAO などで 大きい順に読み、+1するかですね。

そのやり方のヒントがあれば教えてください
投稿日時:2006/10/29 19:30
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ