• 締切済み

データが更新されません

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 ・・・ となって欲しいのです よろしくお願いします

みんなの回答

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

やろうとしていることがデータベース的ではないですね IDというからにはこれはレコードを特定するものであり AccessのようなRDBなら他のテーブルと関係づけるために 設けられているもののはずです そのようなものをレコードが増えたからと言って振り替えるなんてのは データベース的には絶対にやってはならない操作です そうではなく単なるお飾りだというのなら テーブルには持たずにクエリなどで表示の都度振ってやればいいだけの話になりますね

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

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
質問者

お礼

御回答ありがとうございます " ORDER BY ID DESC" ですね。 やってみます

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

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

tocci_pc
質問者

お礼

>UPDATE DVDinfo SET ID = ID + 10000001 WHERE 収録ID >= 6; を実行してから UPDATE DVDinfo SET ID = ID - 10000000 WHERE 収録ID > 6; を実行すればよろしいのでは? そうですね。たしかにそんな値まではデータはたまらないですね。 >あるいは、DAO などで 大きい順に読み、+1するかですね。 そのやり方のヒントがあれば教えてください

関連するQ&A

  • 更新クエリでキー違反

    クエリAのあるレコードからテーブルBのレコードにデータを流そうとします。 テーブルBのレコードにデータがちゃんと入っている と上手くデータが流れて更新されるのですが、IDと 名前しか入っていなかったりするとキー違反になるのです。 とても抽象的ですが、 どうして大丈夫なときとダメなときが発生すると 考えられますか?

  • ACCESS 重複データ削除の順番について

    追加クエリを使って重複データを削除する時に、削除されるデータについて質問です。 重複レコードを含むテーブルの構造のコピーを作成し、重複レコードを含むすべてのフィールドの主キーを作成して、元のテーブルから新しいテーブルへの追加クエリを実行して、重複レコードを一括削除をしています。 [操作についての参考URL] http://support.microsoft.com/kb/879852/ja =========================================== (テーブル) [ID]  [クラス]  [名前]   [時間]     1     A     ああ   11:00 ←重複 2     B     鈴木   12:00    3     C     アア   13:00     ←重複  4     A     ああ   14:00 ←重複 5     B     森    15:00   6     C     アア   16:00     ←重複  7     B     青山   17:00   8     C     アア   18:00     ←重複     9     A     ああ   19:00 ←重複 =========================================== 上記のようなテーブルで「クラス」と「名前」の2つのフィールドを主キーにした場合、 「A」の「ああ」さんと、「C」の「アア」さんが各3件ずつ重複しています。 しかし、「ID」と「時間」はそれぞれ違っています。 このような場合に、削除されないデータと削除されるデータの違いは何なのでしょうか? ACCESSの仕様でとか、レコードの若い番号順で削除されるとか、明確なルールが あれば教えていただけると幸いでございます。 御手数お掛け致しますが、何卒よろしくお願いいたします。

  • 更新クエリのキー違反がどれだかを調べる方法は

    更新クエリのキー違反がどれだかを調べる方法はないですか? 「更新クエリですべてのレコードを更新できません。 0個のフィールド型変換エラー、2件のレコードでキー違反、 0件レコードでロック違反、0件レコードで入力規則違反が発生したためレコードを更新できませんでした」 となるのですが、 「2件のレコードでキー違反」がどれなのかって元テーブルをじっくり眺めて探すしかないのでしょうか? 手作業と目で探してるのですが、見つけられません・・・

  • エクセルでA列B列C列の重複するレコードのみを表示

    エクセルのA列とB列とC列で重複するレコードのみを抽出して別の列に表示させたい。 エクセルのA列とB列とC列にそれぞれ1000行くらいのデータがあります。 それぞれの列内には重複レコードがあります。 この条件の中で 「A列とB列とC列に重複するデータすべて」 を抽出したいのですが、どんな方法がありますか。 抽出されたデータで重複レコードの場合は1件のみで表示したいです。 よろしくお願いします。 例   A   B   C   抽出  1-001-002--002--002 2-002-002--005--007 3-003-007--007--008 4-007-008--008--011 5-008-008--010 6-008-010--011 7-011-011--012 8-013-014--013

  • 10万件のデータに対してチェックを行う。

    こんにちは。Access 2003を使用しています。Accessのテーブルには10万件程度のデータがはいっています。 Excelを開き、1行目から順に読み取って、テーブルにインサート・アップデートをしていきます。 例えば、Excel A列にIDがあったとします。AccessのテーブルにそのIDがなければ、インサート、あればアップデートという仕組みにしています。 データ件数が増えてきて、今は10万件に対し、8万件がアップデートの対象です。処理が終わるのに物凄く時間がかかります。 何かよいアイディアはないでしょうか?例えば、こういった技術を使えばいいとか、こっちの技術を勉強して乗り換えたほうがいいよとかです。よろしくお願いします。

  • データの更新方法について

    データを更新するときSQLで DeleteしてInsertする更新方法と Updateを行う更新方法とがあると思うのですが この使い分け、切り分けはどういう視点になるのでしょうか 私はDeleteしてInsertする方が簡単なので Delete + Insertをよく使っています。

  • PHP5+MySQL5 CSVから、更新、追加する処理の書き方

    こんにちは。 PHP5とMySQL5を使っています。 CSVファイルを読み込み、キーが存在するレコードは更新、 存在しなければ追加、という処理について 色々な書き方を教えて頂けたらと思います。 例えば、フィールドは、ユニークキーとなる[ID]、 [Name]、[TEL]の3つとします。 1.CSV読む 2.行と列の2次元配列に格納 3.行数分ループ開始 3-1.IDをキーに、SELECT 3-2.存在したら 3-3.UPDATE更新 3-2.存在しなかったら 3-3.INSERT追加 4.行数分ループ終了 と考えています。 CSVに100行あったら、100回SELECT掛けることになりますが、 この書き方で問題ないでしょうか? もっと判り易い、こんな書き方も! というのがありましたら、是非頂けますでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 重複したデータを動かさずに並び替えを行う方法

    是非、教えてください。 Excel2000を使用しています。 データベースに重複したデータが存在しているのですが、 作業の都合上、特定の行(B行やC行)を基準にし、 重複しているデータがありその関係を維持したい列(3・4列)の データを固定したまま並び替えを行いたいと考えています。 ところが、普通に並び替えをしてしまうと、 3・4列にあったデータが離ればなれになってしまい困っています。 また優先されるキー等も活用しましたが上手くいきませんでした。 なにか良い方法はあるのでしょうか? 具体例(Cを基準に並び替え)    A    B   C 1  ID  項目1 項目2 2  11   A    c 3  12   B    d ※ 4  12   C    b ※ 5  13   D    a 6  14   B    c ↓ このようにしたいです。    A    B   C 1  ID  項目1 項目2 2  13   D    a 3  12   C    b ※ 4  12   B    d ※ 離ればなれにならない! 5  11   A    c 6  14   B    c 分かりにくい文章で恐縮ですが、 どうぞよろしくお願いします。

  • 2つのサブフォーム間でデータの連携

    今、ある単票フォームに、2つのサブフォームを配置し、そのサブフォーム間で金額の連携をしたいと考えています。 【親フォームA】 ・ID1、長整数型(主きー) ・受付日時 ・発注金額総合計 <== ※Bが更新されたら、ここを更新したい 【サブフォームB】 ・ID2、長整数型(主キー) ・ID1(外部キー) ・発注日 ・発注合計金額 <=== ※Cが更新されたら、ここを更新したい ==> Aの更新へ↑ 【サブフォームC】 ・ID3、長整数型(主キー) ・ID2(外部キー) ・発注項目名 ・単価 ・数量 ==>ここを更新する→Bへ↑ ・単位 ==>ここを行進する→Bへ↑ ・摘要 サブフォームB、Cは、いずれも帳票型です。 それぞれ、テーブルA, B, Cがレコードソースで テーブル構成は、上の項目の構成と同じです。 A-ID1: B-ID1 = 1:多 B-ID2: C-ID2 = 1:多 この時、Cで単価と数量を入力したら、Bの発注合計金額の値を更新したいです。 それと同時に、親Form Aの「発注金額総合計」の値を、Bの全てのレコードの「発注合計金額」のSumで更新したいです。 よろしくお願いします。

  • ASPでMDBファイルを更新する時のロックについて

    こんばんは ASP(VBスクリプト)で MDBファイル(アクセス2000)の データベースを 更新 又は レコード追加 をさせるときの ロックについて悩んでいます。 まず条件として このMDBファイルは 複数のユーザーが共有する物です。 (ここでは仮に A B C と3つのユーザーとします) データの新規登録の時(レコードの追加)はレコード内の項目で 絶対重複しないIDを発行して登録します。 逆に更新の時は そのIDを基に該当レコードを更新します。 また、IDはA*** B*** C*** と言うように 各ユーザーの固有ID+重複しない番号 と言う内容にしています 二重書き込み防止のために色々考えているのですが このIDを基にした方法だと 基本的にはAというユーザーが 同じIDの情報を複数のブラウザ開かない限り二重書き込みには ならないと思っています。 (変更登録などはパスワードで管理して物理的に1人(1画面)しかできないようにしています) なので物理的な2重書き込みはこれで防止できると思っているのですが 正しいでしょうか? ただ、ものすごく悩んでいるのが 1人が1つのデータベースをさわっているのなら良いのですが 複数人が同時に使っている場合、レコードが服従することはないので 2重書き込みはないとしても Aのデータを更新しているときに Bが新しく情報を追加したと言うような 事は起こるはずなので、ファイルが壊れないかと心配しています。 なので cgiで言うような書き込みロックのような事が ASPでもできるのかなと思っています。 ただ、それ以前に こういった使い方はダメでしょうか? (1つを複数人で使うこと) 良くない場合は A、B、C それぞれデータベースを作り それを結合させた方が賢明なのかなとも思っています。 ロックの方法でやるか 個々に作って結合させるか それ以外にもよい方法があるのか これで悩んでします。 また、ロックの場合 Updateではなく Recordsetオブジェクトを使って IDがあれば更新 なければ 追加 と言う方法にしようと 思っていまして その場合 OPENメソッド recordset.Open Source, ActiveConnection, CursorType, LockType, Options で、ロックタイプを3にしても これはUpdateの時だけ有効のようなので 意味がないのかなと思っています ただ MSのHPでの解説で >>レコード単位の共有的ロックを示します。Update メソッドを呼び出した場合にのみ、プロバイダは共有的ロックを使ってレコードをロックします。 と書いているのですが、そもそも >>共有的ロックを使ってレコードをロック と言う意味が分かっていません ファイルを壊さないためにも有効であるなら Updateを使う方法に変えようかとも思うのですが、どうなんでしょうか? なんか 基礎的なことが分かっていないので 分かりにくい質問になりましたが ファイルが壊れないような処理方法を作っていきたいので、ご教授のほど よろしくお願いします。