2011-02-09 18 views
5

Daha sağlam MySQL Sorgular oluşturmaya çalışıyorum ve bu süreçte öğreniyorum. Şu anda ON DUPLICATE KEY sözdizimini ve olası kullanımları kavramak için zor bir zaman geçiriyorum. Koşullu mySQL ifadesi. Eğer gerçek UPDATE ise, yanlış INSERT

Ben, aksi UPDATE Aynı ID ve isimde hiçbir kayıt yoktur, sadece INSERT istediğiniz bir INSERT sorgusu var. ID ve adı UNIQUE değil, ancak ID dizine eklenmiştir. ID, UNIQUE değil, başka bir tablodan başka bir kayda başvurduğundan ve bu tabloda, diğer tablodaki belirli bir kayda başvuran, birden çok kayıt olmasını istiyorum.

Nasıl zaten başka UPDATE rekor set hayır ID ile kayıt ve adı yoktur, sadece ON DUPLICATE KEYINSERT kullanabilirim?

Kolayca QUERIES bir çift Bunu başarmak ve daha sonra PHPIFELSE düşeni yapmak zorunda, ama ben MySQL göndermek QUERIES miktarını LIMIT nasıl bilmek istiyorum olabilir.

cevap

7

UPDATE: Not: Orijinal yanıtında belirtildiği gibi IS NULL yerine IF EXISTS kullanmanız gerekir. Tatlar varsa

Kod tüm mantığını ve kontrol etmek saklı yordam oluşturmak için:

DELIMITER // 

DROP PROCEDURE `GetFlavour`// 
CREATE PROCEDURE `GetFlavour`(`FlavourID` INT, `FlavourName` VARCHAR(20)) 
BEGIN 
IF EXISTS (SELECT * FROM Flavours WHERE ID = FlavourID) THEN 
UPDATE Flavours SET ID = FlavourID; 
ELSE 
INSERT INTO Flavours (ID, Name) VALUES (FlavourID, FlavourName); 
END IF; 
END // 

DELIMITER ; 

ORİJİNAL:

Bu kodu kullanabilirsiniz. Belirli bir kaydın varlığını kontrol edecek ve kayıt kümesi NULL ise, o zaman geçecek ve yeni kaydı sizin için ekleyecektir.

IF (SELECT * FROM `TableName` WHERE `ID` = 2342 AND `Name` = 'abc') IS NULL THEN 
INSERT INTO `TableName` (`ID`, `Name`) VALUES ('2342', 'abc'); 
ELSE UPDATE `TableName` SET `Name` = 'xyz' WHERE `ID` = '2342'; 
END IF; 

benim MySQL sözdizimi biraz paslı değilim ama bu kod en azından oldukça YİNELENEN KEY kullanmak yerine, orada size yolu çoğu almalısınız.

+0

Bununla bir hatayla karşılaşma: SQL sözdiziminde bir hata var; 'IF (SELECT * FROM flavors WHERE id =' 1 'AND Name =' BerryBlue ') yakınında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin. NULL THEN' satır 1'de –

+0

@Vitaliy - I ' ve kodumu güncelledi. Bu size hiç yardımcı olur mu bakın. Değilse, INSERT ifadesini IF ifadesiyle aynı çizgiye koymayı deneyin. –

+0

Bunu zaten denedim. Ayrıca mantığı tersine çevirdi ve bana hala bir sözdizimi hatası veriyor. Hatta tüm PHP versiyonlarını şanssız olarak statik değerlerle değiştirdim. –

2

Neden sadece bir saklı yordamı kullanmıyorsunuz, o zaman tüm mantığı gömebilirsiniz. Ayrıca, diğer uygulamalarda kullanabileceğiniz yeniden kullanılabilir bir kod parçanız (ör. Saklanan pro) var. Son olarak, bu sadece kayıtlı proc aramak için sunucuya tek bir tur yolculuk gerektirir.

+0

SQL için çok yeni ve saklı yordamları nasıl yapacağımı bilmiyorum. Öğrenecek çok şeyim var. Bu gerçeği açıklamak için –

4

Kimliği ve adı benzersiz değil, ancak kimliği dizinli. id benzersiz değil

ben id ve adı zaten başka GÜNCELLEME kayıt ayarlamanız ile hiçbir kayıt yoktur, yalnızca INSERT için YİNELENEN KEY nasıl kullanabilirim

?

Yapamazsınız. DUPLICATE KEY UPDATE tarihinde hangi satırın güncelleneceğini belirlemek için benzersiz veya birincil bir anahtar gerekir. PHP'nin IF ELSE bölümünü yapması daha iyi.

düzenleme:

adı ve kimliği kombinasyonu benzersiz olması gerekiyordu IS, bir çok sütunlu EŞSİZ dizin oluşturabilirsiniz. Oradan DUPLICATE KEY GÜNCELLEME kullanabilirsiniz.

+1

+1. Gibi bir autoincrementing id sütun var gibi geliyor. Bu durumda sadece seçmek ve sonra bir işlemin içine eklemek zorundadır. –

+0

Bu şekilde iki sorguya ihtiyacım var. Biri alanları SEÇ, sonra da diğerine UPDATE/INSERT. Bunu sadece bir sorguda yapabilir miyim görmeye çalışıyorum. Kimlik sütununu otomatik olarak değiştirmiyorum. Kimlik, başka bir tablodaki başka bir kaydın benzersiz bir kimliğini ifade eder. –

+2

Maalesef, BENZERSIZ bir dizin olmadan, yapabileceğinizi düşünmüyorum. Dahili olarak MySQL, önce eki dener ve ardından 'yinelenen anahtar hatası' yakalar ve sonra güncelleştirmeyi yapar. DEĞİŞTİR aynı şekilde çalışır. Belki de id ve isim birleşik bir UNIQUE indeksi oluşturabilir gibi geliyor? Eğer öyleyse, bu kombine endeksi ve ON DUPLICATE KEY sizin için çalışmalıdır. – mluebke