2010-02-08 31 views
13

Sadece kayıt için kontrol edecek ve ek yoksa, bir sorgu var mı? Yinelenen güncelleme yapmak veya değiştirmek istemiyorum. Tek bir sorgu çözümü arıyordum, diğer cevaplara baktım ama umduğum gibi değil.mysql koşullu ekleme - yoksa varsa ekleyin

Tablo:

name|value|id 
------------------ 
phill|person|12345 

sahte sorgusu:

IF NOT EXISTS(name='phill', value='person', id=12345) INSERT INTO table_name 
+1

Soruyu biraz açıklayabilir misiniz? Tek benzersiz alan nedir? (hızlı ve kirli bir şekilde benzersiz bir dizin kullanabilirsiniz ve yinelenen bir değerle bir satır eklemeye çalışırsanız başarısız olur). İsim ve değer de benzersiz olmalı mı? –

+0

her üç değer de benzersizdir ve boş bırakılmamalıdır. Kimliği bir dizine sahip, isim ve değer de farklı olmalı ama kimlik bir zorunluluktur –

cevap

18

Kullanım REPLACE - tablodaki eski satır için yeni bir satır olarak aynı değere sahipse dışında aynen INSERT gibi çalışır PRIMARY KEY veya UNIQUE bir dizin, eski satır yeni satır eklenmeden önce silinir. Başka bir seçenek olduğunu DEĞİŞTİRİN kullanamazsınız beri:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

-- For your example query 
REPLACE INTO table_name(name, value, id) VALUES 
('phill', 'person', 12345) 

Düzenleme (birincil anahtar, tekliği) tablo verilerini ayarı kısıtlama endeksler ve kullanımı INSERT IGNORE

INSERT IGNORE INTO table_name 
SET name = 'phill', 
    value = 'person', 
    id = 12345; 
+0

Evet Bu işlevseyi anlıyorum ama kullanıcım sadece SELECT, INSERT, UPDATE erişim hakkına sahip. ama UPDATE'den uzak durmaya çalışıyorum ve REPLACE işlevi için iznim var mı bilmiyorum –

+2

INSERT IGNORE – Yada

+0

INSERT IGNORE silip kayıt eklediniz mi? ya da bulunursa bulunmazsa, onu atlar mı? –

2

Satır zaten mevcut değilse, yalnızca bir satırı döndürmek için bir alt sorguya sahip olan bir seçim sorgusundan ekleme yapmayla ne dersiniz?

yalancı kod: Bu model çalışması gerekir

INSERT INTO TABLE_FOO (...) 
SELECT @VAR1, VAR2 ... 
FROM DUMMYTABLE -- THIS TABLE SHOULD CONTAIN 1 RECORD OF ANYTHING 
       -- IN CASE THE FROM IS REQUIRED 
WHERE (SELECT COUNT(*) FROM TABLE_FOO WHERE COLUMN1 = @VAR1) = 0 

, sadece MySQL için doğru sözdizimi almak gerekir.

+2

Bu, anahtarları veya benzersizleri kullanmayan satırlarla uğraşırken kullanışlıdır. – zigg