2011-02-09 12 views
5

私はより頑強に作成しようとしていますMySQLクエリとその過程で学びます。現在、ON DUPLICATE KEYの構文と可能な使用法を理解しようとするのは苦労しています。条件付きのmySQL文。本当のUPDATEの場合、falseの場合INSERT

私はINSERTを持っています。同じIDと同じレコードが存在しない場合にのみINSERTとしたい場合は、UPDATEと入力してください。 IDであり、名前はUNIQUEではなく、IDである。 IDUNIQUEではありません。別のテーブルの別のレコードを参照しているため、このテーブルの複数のレコードを別のテーブルの特定のレコードを参照したいからです。

ON DUPLICATE KEYINSERTは、IDのレコードがなく、すでに設定されている場合にのみ、他にUPDATEと記録されますか?

私は簡単にQUERIESのカップルでこれを達成し、その後PHPIFELSE一部を行うありますが、私は私がMySQLに送信QUERIESの量をLIMITする方法を知りたいことができます。

答えて

7

更新日:元の回答に示されているように、IS NULLの代わりにIF EXISTSを使用する必要があります。

すべてのロジックをカプセル化し、フレーバーが存在するかどうかを確認するために、ストアドプロシージャを作成するためのコード:

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 ; 

原文:

あなたはこのコードを使用することができます。特定のレコードの存在をチェックし、レコードセットがNULLの場合は、新しいレコードを挿入して挿入します。

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; 

私はMySQLの構文に少しさびたんだけど、そのコードは、少なくともかなりDUPLICATE KEY ON使用するよりも、あなたはそこに道のほとんどを取得する必要があります。

+0

これでエラーが発生する:SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が使用されるようにしてください。(IF * SELECT * FROM flavors WHERE id = '1' AND Name = 'BerryBlue')IS NULL THEN 'on line 1 –

+0

@Vitaliy - 私のコードを更新しました。それがあなたを助けるかどうかを見てください。そうでない場合は、INS文をIF文と同じ行に置いてみてください。 –

+0

すでに試しました。また、ロジックを逆にしても、構文エラーが発生します。私はすべてのPHP変数を静的な値に置き換え、運がない。 –

2

ストアドプロシージャを使用するだけでなく、他のアプリケーションで使用できる再利用可能なコード(ストアドプロシージャなど)がある場合は、すべてのロジックを埋め込むことができます。最後に、これはストアドプロシージャを呼び出すためにサーバーへの1回のラウンドトリップを必要とします。

+0

私はSQLの初心者で、ストアドプロシージャの作り方を知らない。私は学ぶべきことがたくさんある。その事実を説明するために+1 –

4

idとnameは一意ではありませんが、idは となります。 IDは一意ではありません

私はidと名前がすでに他の UPDATEレコードを設定することを 持つレコードがない場合にのみ、 INSERTにDUPLICATEキーを使用することができますどのように

できません。 ON DUPLICATE KEY UPDATEには、更新する行を決定するための固有キーまたは主キーが必要です。 IF ELSEの部分をPHPで実行する方が良いです。

編集:

名前とIDの組み合わせがユニークなことになっている場合は、マルチカラムUNIQUEインデックスを作成することができます。そこからON DUPLICATE KEY UPDATEを使用することができます。

+1

+1。彼はオートインクリメントID列を持っているように思えます。この場合、彼は単にトランザクションの中に挿入してから挿入しなければなりません。 –

+0

これで、私は2つのクエリが必要になります。 1つはフィールドを選択し、もう1つはUPDATE/INSERTに選択します。私はただ1つのクエリでこれを実行できるかどうかを確認しようとしています。私はid列をオートインクリメントしていません。 idは、別のテーブルの別のレコードの一意のIDを参照します。 –

+2

UNIQUEインデックスがないと残念ですが、私はあなたができるとは思いません。内部的にMySQLは挿入を最初に試み、次に「重複キーエラー」をキャッチしてから更新を行います。 REPLACEも同じように動作します。おそらくIDと名前が結合されてユニークインデックスを構成するように思えるでしょうか?もしそうであれば、その複合インデックスを作成し、ON DUPLICATE KEYが機能します。 – mluebke