質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.22%

AccessからMySQLのデータベース更新について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 418

ysk1118

score 12

前提・実現したいこと

ODBCデータソースにMySQLのDBを登録し、Access2010にて、リンクテーブルで管理しているMySQL側のテーブル(仮にAとします)と、
別のAccessDBからのリンクテーブル(仮にBとします)を管理しています。

Bには1ヶ月間の出勤時刻データが格納されていて、毎日更新されます。
AはBの累積データが格納されています。

月初めにBからAに1ヶ月分のデータレコードを用意し、以後は毎日レコード更新という形で
Aのデータが更新されるように考えています。
テーブル構成は下記のとおりです。(項目省略しています)
A
年月日:日付/時刻型(主キー)
社員No:数値型(主キー)
勤務区分:テキスト型
出勤時刻:時刻型
退勤時刻:時刻型

B
年月日:日付/時刻型(主キー)
社員No:数値型(主キー)
勤務区分:テキスト型
出勤時刻:テキスト型
退勤時刻:テキスト型

※10:59訂正しました。B側の時刻データはテキスト型となっておりました。

発生している問題・エラーメッセージ

次のSQL文を実行してデータ更新を行っていますが、勤務区分をはじめ、他の数値・テキスト項目は
更新されているのですが、時刻の項目だけが更新されません。

UPDATE A INNER JOIN B ON A.年月日=B.年月日 and A.社員No=B.社員No 
SET A.出勤時刻=B.出勤時刻,A.退勤時刻=B.退勤時刻,A.勤務区分=B.勤務区分


何か原因として考えられるものがあればご教示下さい。
※10:59訂正により、テキスト型データを時刻型フィールドには代入できない?

試したこと

ODBCの設定より、「Return matched rows instead of affected rows」にチェックを入れています。(これが無いと、更新時にレコードのロック違反というエラーメッセージが表示され、勤務区分すらも更新されなかった。)

補足情報(FW/ツールのバージョンなど)

MySQL ODBC 8.0 Unicode Driver 8.00.12.00
Access2010 SP2

よろしくお願いいたします。

※17:23 画像削除させていただきました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2019/04/08 16:44

    テーブルAは、
    年月日:日付/時刻型、出勤時刻:時刻型、退勤時刻:時刻型ではなく、
    年月日:日付型、出勤時刻:日付/時刻型、退勤時刻:日付/時刻型じゃないですか?

    キャンセル

  • ysk1118

    2019/04/08 16:48

    おっしゃる通りです。Accessでリンクテーブルのデザインで開くと日付/時刻型ですが、MySQL(phpMyAdmin)では、Time型となっています。

    キャンセル

  • sazi

    2019/04/08 17:05

    直接値を指定して更新されOKだったクエリーも追記して貰えますか。

    キャンセル

  • ysk1118

    2019/04/08 17:13

    UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) SET A.勤務 = B.勤務, A.出勤 = '11:00', A.退勤 = B.退勤
    WHERE B.社員No=18895;
    こちらで実行し、出勤時刻が全日において2019/04/08 11:00となりました。

    キャンセル

回答 2

checkベストアンサー

+2

テキスト型である出勤時刻および退勤時刻はどのような書式で格納されていますか?
更新先が時刻型であるので、テキスト型でHHMMなど格納されているのであれば、HH:MMのように変換しないと駄目じゃないでしょうか。
但し、ODBCドライバーが暗黙変換してくれればの話ですので、駄目な場合は型を合わせる必要があると思います。

追記

UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) 
SET A.勤務 = B.勤務, A.出勤 = '11:00', A.退勤 = B.退勤


これで問題ないという事なので、更新されているのかどうかをlastupdateを更新するようにしてみると更新されているかどうかが分かると思います。

UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) 
SET A.勤務 = B.勤務, A.出勤 = B.出勤, A.退勤 = B.退勤, A.lastupdate=Now()

追記2

暗黙変換のせいかもしれませんので、以下を試してみてください

UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) 
SET A.勤務 = B.勤務, A.出勤 = CStr(B.出勤), A.退勤 = CStr(B.退勤)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/09 10:21

    件数が20000件を超えるので、1件ずつのUPDATEは避けたいと考えています。
    そしてご報告になりますが、テーブルBは別ファイルのMDBからリンクテーブルとして参照しておりました。この参照ファイルを本環境から再度コピーし直したところ、正常に更新が行われることが確認できました。
    テスト環境を準備している際に元データに何らかの異常が生じてしまったのではないかと考えております。(見た目のデータには何ら異常ないのが腑に落ちませんが)
    sazi様にはここまで様々な助言をいただき感謝の気持ちでいっぱいです。
    私の環境で用意した元データの不具合という結論に至り、申し訳ない気持ちもありますが、ここまでご協力いただき、本当にありがとうございました。

    キャンセル

  • 2019/04/09 10:50 編集

    ACCESSのテーブルのデザイン変更すると、おかしな動作になる場合があります。
    最適化/修復でも改善しないので、
    ・テーブルをエクスポート(XML)→インポート(XML)
    を行う事をお薦めします。
    ※MSのサポート情報があったはずですが、失念。
    適用後にデータサイズも圧縮される場合が殆どです。

    キャンセル

  • 2019/04/09 11:44

    確かにデザイン変更を弄った記憶があります。
    以後気を付けたいと思います。
    重ね重ね、ありがとうございました。

    キャンセル

0

ODBCの日付時刻形式を使うのではないでしょうか。

https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2005/ms190234(v=sql.90)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 16:49

    ご回答ありがとうございます。
    提示されたURLおよび検索して調べてみたのですが、実際のところ、クエリにどう組み込んだらよいのかがよく分かりませんでしたので、引き続き調べてみたいと思います。

    キャンセル

  • 2019/04/08 16:52

    リンク先はSQL-SERVERの話では?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる