2016-03-19 19 views
2

私は数秒ごとに新しいデータを取得するテーブルを持っています。 (私はこれが正しいことを確認していない)説明が一意である列の特定の時間にデータが重複しないようにする間隔

+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| id | business_id | name | description     | link | status | created_at   | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| 1 | 12   | qwerty | Description for product qwerty | zxcvb | 1  | 2015-12-07 23:49:33 | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| 2 | 12   | abcde | Description for product abcde | mnopq | 0  | 2015-12-07 23:49:33 | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 

値:製品私のテーブルを検討してください。

条件:新しいデータが最後に挿入されたデータと同じですが、タイムスタンプが5分より大きい場合、更新を実行するか、または新しい行をテーブルに挿入します。 の名前がの場合、はユニークです。

クエリ私が試してみました:

INSERT INTO product(business_id, name, description, link) 
VALUES ('$business_id' ,'$product_name','$product_description', '$short') 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

どの条件私は変更する必要がありますか?固有のキーを削除する必要がありますか?

答えて

1

あなたが重複説明値を挿入します。この要件に

あなたが効果的に説明ない一意であることを言います。したがって、実際には、これを可能にするために、これらのフィールドにuniqueのキー/インデックスをドロップする必要があります。

第2に、新しい値がすでにテーブルに存在する場合は、最後に挿入されたレコードである必要がありますが、それが保証されていないと思われます。また、最初の値Aが挿入されてから1分後に値Bが、次に10分後に値Aが再入力される可能性も考慮する必要があります。

あなたが提示したロジックでは、最後の操作は重複として検出され、最後に挿入されたレコードの更新に変換されます。しかし、値Aのレコードではありませんでした。実際には、ON DUPLICATE節では、その場合重複したエラーが発生します(ID:)。だからここ

は私がやってことをお勧めです:

説明UNIQUEキー/索引を削除して、あなたはまだ非一意索引を使用することから利益を得ることができます。準備された文の引数に

INSERT INTO product(business_id, name, description, link) 
SELECT :business_id, :name, :description, :link 
FROM product 
WHERE NOT ( name = :name 
      AND description = :description 
      AND created_on < DATE_ADD(NOW(), INTERVAL -5 MINUTE) 
     ) 

:意味のプレースホルダ:

は、次のINSERT文を使用します。あなたはSQL injectionに脆弱であるため、あなたのようにSQL文内に文字列を挿入する必要があります。 converting your code to use prepared statementsについて読む

説明値の組み合わせは、すでに以前に登録されている、そしてそれが5分以上前に起こった場合は、上記のINSERT文は何もしません。

この場合、num_rowsメソッドでレコードが挿入されていないことをPHPでテストできます。それが0を返す場合は、更新を実行するために2番目のSQLを実行します。

UPDATE product 
SET link = :link 
WHERE name = :name 
    AND description = :description 
    AND created_on < DATE_ADD(NOW(), INTERVAL -5 MINUTE) 

この場合も、準備済みの文でこれを行う必要があります。

0

descriptionを一意のものとして使用すると、同じ記述で新しいレコードを挿入することはできません。ユニークは "id"で使用する必要があります。

if節を使用して、同じ場合はbusiness_idをチェックし、5分を超えるcreate_atをチェックして新しい行を更新または挿入できます。自分のタイムスタンプが5分以上後に最後に挿入されたレコードのそれよりもないとき

+0

idはプライマリである必要があります。名前は確かにユニークである可能性がありますが、説明が不可能であるか不必要であるように思われます。ここにif節は必要ありません。実際、それは非生産的であろう。 – Strawberry

関連する問題