2

私はこれにかなり慣れていないので、知識が不足していることをお詫びします。

ここでのアドバイスのおかげで、CGIおよびDBIモジュールを使用してPerlスクリプトを介して正常に書き込み、アクセスできるいくつかのテーブルを設定しました。

これは地元のバンドニュースレターのメンバーリストです。ええ、私は知っています、そこにはたくさんのアプリがありますが、私はこれを学びたいと思っています。

1-入力の一部が特定の列/フィールドの列データと一致する場合、行の更新や挿入を避けたかったのです。

テーブルを作成するときに、phpmyadminで、構造ビューでその列名の「U」(一意)をクリックしました。それはうまくいったようで、重複は挿入されていませんが、ハードコードされたPerlソリューションが欲しいので、これの仕組みを理解しています。

「insertignore」/「updateignore」を読んで全体を検索しましたが、見つけたものはすべて、重複をスキップするだけではないようです。

この列はキーではなく、電子メールアドレスを含む単なる古いフィールドです。(間違い?)

2-データベースに書き込むときに、受信メールアドレスがそのフィールドのアドレスと一致する場合は何もしません。

私は最速の方法を望んでいるので、既存のリストのエクスポートデータをループして(ソフトウェアを理解できません)、レースやロックの問題や、明らかに無知な状態に陥ることはありません。

私はこれを最初から作成しているので、1と2は実際には部分的に無意味かもしれません。もしそうなら、最善のアプローチは何でしょうか?

それでも自動インクリメントIDが欲しいので、ID番号を介してアクセスするか、何らかのcount++foreachでループスルーできます。

私の石のナイフのアプローチは、ここの教祖には笑えるかもしれませんが、どこかから始める必要があります。

よろしくお願いします。

4

2 に答える 2

1

挿入を実行するだけです。データによって一意の列が一意でなくなる場合は、SQLエラーが発生します。これをトラップして、適切な処理を実行できるはずです(たとえば、無視する、ログに記録する、ユーザーに警告するなど)。

于 2010-10-22T12:30:44.713 に答える
1

メールアドレスの列がUNIQUEと宣言されているので、INSERTIGNOREはまさにあなたが挿入したいものです。あなたはすでに正しいことをする方法を知っているようですね!

(perlで「すでに存在する場合は挿入しない」機能を実行できますが、テストと更新をトランザクションでラップする必要があるため、正しく実行するのは困難です。リレーショナルデータベースの大きな利点の1つは、このような制約チェックを実行し、アプリケーションにバグがある場合でもデータの整合性を確保します。)

更新については、「更新無視」がどのようになるかわかりません。UPDATEを制限して1つの目的の行にのみ影響を与えるWHERE句には何がありますか?おそらく、あなたが言及したauto_increment主キーですか?たとえば、書きたい場合は、

UPDATE members SET firstname='Sue' WHERE member_id = 5;

次に、この「更新無視」機能は、次のようなものになると思います。

UPDATE members SET firstname='Sue' WHERE member_id = 5
    AND email != 'sue@example.com';

これは奇妙なことですが、それはあなたが何を意味するのかについての私の最善の推測です:)

于 2010-10-22T14:07:53.983 に答える