2011-07-04 42 views
0

我希望有一個包含3個字段的表,並使用REPLACE更新此表以覆蓋行而不是在兩個字段匹配後續添加時創建新行。在2列必須匹配唯一行時使用REPLACE INTO MySQL數據庫

換句話說,我想要做這樣的事情 '表' 具有行 'A', 'B' 和「c'-

REPLACE INTO表集合C = $ var_c其中A = $ 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

如果您對a你的桌子上2個鍵和b,你可以這樣做:

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

我會電子書籍使用REPLACE在所有;一般情況下,我更喜歡INSERT INTO ... ON DUPLICATE KEY UPDATE。 REPLACE表示刪除,而不是INSERT。對於使用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會自動從表child中刪除所有引用記錄。是的,這是有點想要的,因爲你說「ON DELETE CASCADE」。不過你必須記住REPLACE可能是危險的。另一方面,「ON DELETE NO ACTION」意味着你的REPLACE會失敗,因爲它看起來不合理。 最後有 - 國際海事組織 - 刪除和插入相同的記錄沒有意義,通常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 
相關問題