O zaten bir değeri yoksa yalnızca bir satır eklemek ama mümkün mü?

7 Cevap php

Bir satır eklemek için, ama zaten tablodaki değerlerden sadece biri yoksa mümkün mü?

Ben veritabanı tabloya arkadaşınızın e-posta eklemek gerekir, ama zaten tabloda yoksa yalnızca bir e-ticaret sistemi için sevk puan ile bir Tell A Friend oluşturma. Ben herhangi 1'den fazla kişi kez yeni müşteri bulguları ve alımları şey sevk puan almak istemiyorum çünkü bu. Bu nedenle şimdiye kadar bir kez tabloda yalnızca bir e-posta istiyorum.

PHP 4 ve MySQL 4.1 kullanıyorum.

7 Cevap

Sütun bir birincil anahtar veya benzersiz bir dizin ise:

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE
email=email_address

Şansımı biliyorum ama bunu yapmanın daha iyi bir yolu var. AFAIK MySQL "ON YİNELENEN KEY ŞEY DO" hiçbir eşdeğeri yoktur. Ben e-posta hakkında = email_address bit, hakkında oynamak ve bunu bir eylem belirtmek zorunda kalmadan çalışır görmek olabilir emin değilim. Birisi olsa da yukarıda belirttiği gibi onu benzersiz kısıtlamaları varsa, hiçbir şey yine olur. Bir tablodaki tüm e-posta adresleri benzersiz olmak istiyorsanız Ve sütun tanımının içinde benzersiz olarak bunu belirtmek için hiçbir neden yok.

Eğer sütuna (bu örnekte EmailAddr) benzersiz bir dizin veya birincil anahtar varsa, bu işleri:

INSERT IGNORE INTO Table (EmailAddr) VALUES ('test@test.com')

Bu e-posta ile bir rekor zaten varsa, bunun yerine bir hata (yinelenen anahtar ihlali) Bunu kullanarak, deyim sadece başarısız olur ve hiçbir şey eklenir.

Daha fazla bilgi için MySql docs bakın.

Büyük olasılıkla gibi bir şey:

IF NOT EXISTS(SELECT * FROM myTable WHERE Email=@Email) THEN INSERT INTO blah blah

Yani bir veritabanı sorgu içine yuvarlandı edilebilir.

Naeblis cevabı için hafif bir değişiklik / ekleme:

INSERT INTO table (email) VALUES (email_address)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)

Bu şekilde eğer deyimi güncellemeleri LAST_INSERT_ID() and sizin için doğru değeri elde orada email=email_address atmak zorunda değilsiniz.

Source: MySQL Dokümanlar: 12.2.5.3

Ben bunu var ise emin değilim, ama ne yaklaşık bir

try {
  mysql_query($sql);
}
catch(Exception $e) {

}

MySQL bir benzersiz alan dizin ile birlikte?

if it throws an exception then you know that you got a duplicated field. Sorry if that don't answer your question..

Bye!

E-posta alan birincil anahtar ise daha sonra masaya kısıtlamalar girilen bir yinelenen durdurmak olacaktır.

MySQL /> REPLACE INTO

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.