- ベストアンサー
[AC2000]SQLで追加若しくは更新する考え方
会社で店舗毎での勤怠管理のソフトの作成を指示されたのですが、 各店舗はVPN(GA)でネットワーク化されており、本社にファイルサーバーがあります。 しかし、会社のデータベースソフトはAccess2000しか無いので、本社のサーバーにデータ用のMDBを置き、各店舗には入力用のMDBを置き、本社では管理用のMDBを置こうと思います。 本題なのですが、リンクテーブルを使用すると当然重く、同時に各店舗から入力するのが困難なので、SQL(INSERT INTOとUPDATE)で制御しようとしたのですが、データがあったら更新、無ければ追加する、の様な条件制御をSQLで出来るのでしょうか? ADOでやれば出来るのですが、スキルアップの為悩んでいます。 考え方をご教授頂ければ、後は作成中のMDBに応用させて見たいと思いますので、宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>データがあったら更新、無ければ追加する、の様な条件制御をSQLで出来るのでしょうか? SQLというか、VBAなどのプログラミングで無理矢理どうこうする方法というのはあります。 テーブルには当然、主キーがあるはずですから、 1.選択クエリで追加/更新したい主キーのデータを抽出してみる 2.データが存在する→更新クエリを実行 データが存在しない→追加クエリを実行 ただし、厳密に考えるとこれにもいろいろ問題はあります。 1.でデータがない、と分かった次の瞬間に別の端末から、そのキーと同じ情報で 別のデータが追加された場合、2.でデータを追加しようとすると主キー違反が起きます。 通常はこれを回避するためにテーブルにロックをかけるわけですが、 ロックのかけ方を誤ると、他の端末からデータの参照すらできなくなる、 2端末でロックをかけあって、両方のロックが解除されないデッドロックに陥る… など、さまざま問題があります。 ※一般的なデータベースの話もあるので、Accessでどこまでのことが起きるかはちょっと分かりませんが。 また、「データがあれば更新」ということですが、 これだと、別の端末で先に入力したデータがまったく別の情報によって上書きされてしまう、 というようなことが起きないとも言えません。 データの追加、訂正が頻繁に起こるような仕組みなら、そこも考慮しておかないと、 後々「何故かデータが消えた、おかしくなった」ということで頭を痛めることになるかもしれません。
その他の回答 (1)
- assault852
- ベストアンサー率48% (1364/2797)
どうしてもAccessでなければいけませんか。 クラサバのスタイルでは、あまりにも一般的ではないと思いますが。 Oracleなど導入できませんか。 インタフェースはAccessでも良いと思いますが。 再考をオススメします。
補足
お返事有難うございます。 社長よりAccess指定で指示が来てしまっているのと、経費的な問題で商用DBの購入は難しいです。 作成する時間も十分にありませんので、 フリーのDB(MySQLなど)でも一から勉強していては間に合いませんし、 現状私のスキル(オフィス系VBAと他言語少々)程度の能力で作成しないといけませんので、 少々時代遅れなのかもしれませんが、現状のスキルをブラッシュアップする事で対応しようと考えております。
お礼
遅くなりましたが、何とかAccess環境下で実現(?)する事が出来ました。 ただやはり、近年の方法を勉強すべきなのでしょうね。 今回、いろいろと考える機会をお与え下さって有難うございました。
補足
お返事有難うございます。 頂いたアドバイスを元にいろいろと考えてみました。 テーブルは一つにせずに店舗毎に分けて、 各店舗のIPアドレスの3桁目でテーブルの自動振分をしようと思います。 これなら何か修正追加があった時も上書きで対応できそうなので… 幸いにも各店舗で作業する人間は1名だけなので何とかなりそうです。 追加と更新を逆の発想で行こうと思います。 サーバーのデータを基にリアルタイムで更新を考えていましたが、 テーブルに更新を確認するフラグのフィールドを設けて、 子にもデータを貯めて行き、 更新フラグで制御してIDが同じものを親MDBから削除して追加する事で、偽更新する事にします。 親はあくまでバックアップのmdbと考えて、サーバーと同一のネットワークに出力集計用のmdbをまた別に設ける事にしました。 ・・・かなり回りくどいやり方になってしまいましたが、速度と安定性を優先して、手間を増やす事にしました。 明日、実践してみようと思います。