2011-07-09 17 views
2

私のmySQLデータベースでPHPスクリプトを使用しています。私が持っているものは、検索ページのために引っ張られている製品の目録です。私はこれがうまく動作し、私の検索ページは完璧に動作しています。私が理解できないのは、データベース内の各製品の在庫を更新する方法だけです。私は、製品番号と一致する必要がある新しいファイルを持っているし、mysqlデータベースの1つの列にデータを置き換える必要があります。多くMySQLの更新行。多くのユニークな行を更新する必要があります

MySQLデータベース下にこのような:

ProductNumber .................. ProductStock

12345678 .......... .......................... 1

新しいファイル:

12345678 ........... ....... 5

基本的には、mysqlの製品番号と一致するように新しいファイルが必要です。 ckを新しい番号で置き換えます。このすべてはPHPで行います。

+0

あなたがこれまでに持っているものを見てみましょう。どのような問題が発生していますか? –

+0

あなたは、あなたの製品テーブルに積み重なった在庫の合計を保持しているということですか?あなたがアイテムを売るたびに、合計から減算し、アイテムを購入するたびに合計に加算します。そうであれば、正規化ルールが破られます。 – Leslie

+0

@Leslieいいえ、私は稼いでいる合計を保持していませんが、列は毎日更新する必要があります。 – PTC

答えて

2

あなたは、そのデータベースに入っている行の数を指定しません。通常、個々の更新はかなり遅いです。

あなたは

  • お使いの製品のテーブルに値を設定するためにJOINを使用してUPDATEを行うことは、LOAD DATA INFILE
  • を使用して一時テーブルにあなたの "新株式" ファイルを読み込むことができ

これは数桁速くなります。 mysqlの上で使用する構文と

更新:あなたはは、LOAD DATA INFILEのための特別な権限を必要とする

UPDATE products p JOIN temp_products t ON (p.id=t.id) SET p.stock = t.stock; 

注意。 LOAD DATA INFILE LOCAL(ドキュメントをチェック)を使用することもできます。

またはPHPでファイルを解析し、一時テーブルに複数の値を持つINSERTを生成し、結合更新を行うことができます。これはLOAD DATA INFILEよりも少し遅くなりますが、27000回のクエリよりもはるかに高速です。

+0

これは動作する可能性があります。私のデータベースは27000以上のエントリを持っています。 – PTC

1
$sql = 'UPDATE table_products SET ProductStock=5 WHERE ProductNumber=12345678'; 
mysql_query($sql); 

基本的に、データベースにはUPDATEステートメントを使用してください。

ファイルはどのように見えますか?

+0

私はこのコマンドを使用しましたが、私が扱っているファイルは固定長のテキストファイルです。基本的には、テキストファイルのすべての行に対してこのコマンドを実行する必要があります。だから私はそれをPHPにフィードする必要があります。 @Shahal Thariqueのメソッドを見て、explode()タグを使う必要があるかもしれません。どのように固定長テキストファイルでこれを使用する任意のアイデアですか? – PTC

0

ファイルを開く必要があります。explode()を使用し、必要条件に応じてpreg_matchを使用してください。

0

これを行うには、mysqlのロードデータのローカルinfileを使用できます。小さなインポートスクリプトを作成し、毎日cronで実行します。株式ファイルはCSV形式ですか?フィールドがにより終了とで囲まれているものだろう検討する

$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR; 
$stock_file = $dir . "files". DIRECTORY_SEPARATOR."stock.csv"; 

$stock_query = " 
    load data local infile \"{$stock_file}\" 
    replace into table products 
    fields terminated by ',' enclosed by '\"' 
    lines terminated by '\n' 
    ignore 1 lines 
    (ProductNumber,ProductStock); 
"; 

$m->query($stock_query); 

物事を次のように

スクリプトの例は次のようになります。また、1行を無視すると、ファイルにヘッダー行がある場合は無視されます。

関連する問題