2011-07-04 4 views
0

3つのフィールドを含むテーブルを作成し、後続のフィールドに2つのフィールドが追加されたときに新しいフィールドを作成するのではなく、私は 2列が一意の行に一致する必要がある場合、MySQLデータベースでREPLACE INTOを使用する

は= $ var_c WHERE = $ CテーブルセットにREPLACE c'-行 'A' を持っている 'テーブル'、 'B' と」にこのような何かをしたい言い換えれば

var_bとb = $ var_b

AND bが一致する行があるかどうかをチェックし、更新する行がない場合は新しい行にcを書き込むようにします。 (わかりやすいと申し訳ありません)

ここではREPLACEを使用する代わりに行ったことがあります。このコードは必要なものを実現しますが、これを行うためのより効率的な方法があると確信しています。おかげ

$query1 = "SELECT COUNT(*) FROM table WHERE a = $var_a AND b = $var_b"; 
$result = @mysql_query ($query1); 
$num = mysql_fetch_row($result); 
if($num[0] != 0) { 
    $query = "UPDATE table SET c = $var_c WHERE a = $var_a AND b = $var_b"; 
} 
else { 
    $query = "INSERT INTO table VALUES ($var_a, $var_b, $var_c)"; 
} 
$result = @mysql_query ($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 
+2

'(a、b)'にユニークキーがありますか?もしあれば、 'REPLACE INTO ...'が動作するはずです。 – Hammerite

答えて

0

あなたがこれを使用することができbaであなたのテーブルの上に2つのキーを持っているとした場合:

$query = "INSERT INTO table VALUES ($var_a, $var_b, $var_c) 
      ON DUPLICATE KEY UPDATE c = $var_c "; 
3

私はまったくREPLACE使用するををしませrecommentでしょう。一般的に私はINTO ... INSERT ... DUPLICATE KEY UPDATEを好む。 REPLACEは、INSERTよりDELETEを意味します。これは特に、ON DELETE CASCADE節の外部キー制約では危険です。

CREATE TABLE parent(
id TINYINT UNSIGNED NOT NULL, 
data VARCHAR(255) NOT NULL, 
PRIMARY KEY(id) 
) Engine = InnoDB; 
CREATE TABLE child(
id TINYINT UNSIGNED NOT NULL, 
parent_id TINYINT UNSIGNED NOT NULL, 
PRIMARY KEY(id), 
FOREIGN KEY(parent_id) REFERENCES parent(id) ON DELETE CASCADE 
) Engine = InnoDB; 

親テーブルに対してREPLACEを実行すると、テーブルの子レコードからすべての参照レコードが黙って削除されます。はい、これは多少なりとも必要なことです。あなたが「ON DELETE CASCADE」と言ったからです。それでも、REPLACEは危険であるかもしれないことに注意しなければなりません。一方、「アクションを削除する」とは、あなたのリプレースが失敗することを意味します。それは賢明な理由がないと思われるからです。 最後には - IMO - 同じレコードを削除して挿入する必要はありません。通常はINSERT INTO ... ON DUPLICATE KEY UPDATEはあなたが本当に必要としているものです。

1
IF EXISTS(SELECT 1 FROM Mytable WHERE a = v1 AND b = v2) 
BEGIN 
    UPDATE Mytable SET c = v3 
    WHERE a = v1 AND b = v2; 
END 
ELSE 
BEGIN 
     INSERT INTO Mytable(a,b,c) 
     VALUES (v1,v2,v3) 
END IF 
関連する問題