2016-03-19 17 views
2

Her birkaç saniyede yeni veriler alan bir tablom var. (Bunun doğru olduğundan emin değilim) adı ve açıklama benzersizdir sütunlardaBelirli bir süre için verileri çoğaltmaktan kaçının Aralık

+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| 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 | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 

Değerler: ÜRÜN benim masa düşünün.

istediğim durumu: Yeni veri son eklenen verilerle aynıdır ama zaman damgası fazla 5 dk sonra güncelleme yapmak veya başka tabloda yeni satır ekleyin ise. adı ve tanımları benzersiz olsa bile.

Sorgu denedim:

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) 

hangi koşul ben değiştireyim? Benzersiz anahtarları kaldırmalı mıyım? siz benzersiz bir açıklama kullanırsanız

cevap

1

yinelenen adını ve açıklama değerleri eklemek istiyorum. Bu gereksinim ile

etkili adı ve açıklamadeğil benzersiz olduğunu söylüyorlar. Yani, bu mümkün kılmak için unique anahtar/endeksi bu alanlara bırakmanız gerekecektir.

İkincisi, yeni değerler zaten tabloda varsa, son eklenen kayıtlarının olması gerektiğini varsayalım, ama bunun için hiçbir garanti var gibi görünüyor. Ayrıca, A ilk değerlerinin eklenmesi olasılığını da dikkate almalısınız, sonra B dakika sonra B değerleri ve daha sonra 10 dakika sonra tekrar A değerleri. Eğer sunulan mantıkta

, son operasyon yineleme olarak tespit edilecektir ve son eklenen kaydın bir güncelleme çevrilmesi söz konusuydu. Ama bu, o durumda kendi başına bir yinelenen hata üretecektir önermek ON DUPLICATE fıkra ( id üzerinde çoğaltmak) Aslında değerleri A. ile kayıt değildi. Yani burada

Yapmak tavsiye ettiğimiz:

isim ve açıklama üzerinde UNIQUE anahtar/dizin bırakın, ama yine de benzersiz olmayan endeksleri kullanılarak yararlanabilecek; hazırlanmış bir açıklamada bir argümanlar için

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) 
     ) 

: göstermektedirler yer tutucular:

aşağıdaki INSERT deyimi kullanın. dizgesini sizin yaptığınız gibi SQL ifadeleri içine eklemeniz gerekir, çünkü SQL injection'a karşı savunmasız kalırsınız. converting your code to use prepared statements hakkında okuyun. adı ve açıklama değer kombinasyonu zaten daha önce tescil edilmişse

yukarıdaki INSERT deyimi şey yapmayacağım ve bu fazla 5 dakika önce olmuş.

Bu durumda, PHP'de num_rows yöntemiyle hiçbir kaydın eklenmediğini test edebilirsiniz. O 0 dönerse, o zaman güncellemeyi gerçekleştirmek için ikinci bir SQL gerçekleştirmeniz:

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

Yine, hazırlanan ifadelere yapmalısınız.

0

o zaman aynı bilgi ile yeni bir kayıt eklemek mümkün değil. Benzersiz "id" de kullanılmalıdır, bu yüzden evet, açıklamayı benzersiz bir şekilde kaldırmalısınız.

Ve fıkra aynı olmadığını business_id olmadığını kontrol etmek ve daha büyük 5 dakikadan sonra güncellemek veya yeni satır eklemek create_at için eğer kullanabilirsiniz. Onların zaman damgası fazla 5 dakika sonra son eklenen kaydın daha değilken

+0

kimliği birincil olmalıdır, bu nedenle tanım benzersizdir. İsim kesinlikle eşsiz olabilir, ancak bu tanımın akla gelmeyeceği düşünülebilir. Burada bir iflas maddesine gerek yok. Aslında, ters tepebilir. – Strawberry

İlgili konular