2014-03-18 41 views
0

所以我試圖避免調用表格,看看我是否有條目來插入新行或更新它。我試着下面的查詢,但我得到語法錯誤。有人可以請幫忙。如果一行的所有列條目都不存在,MySQL會插入表格

這裏是我的查詢:

IF(
    NOT EXISTS(
    SELECT 
     * 
    FROM 
     ranking_rank_data 
    WHERE 
     rank = '1' 
    AND source_id = '1' 
    AND ranking_school_id = '2' 
) 
) THEN INSERT INTO 
    ranking_rank_data (rank, source_id, ranking_source_id VALUES ('1','2','3') 
END IF; 

回答

1

你可以使用一個INSERT ... SELECT查詢,從虛表DUAL選擇和把where子句在那裏,如果條件爲假不行將被插入:

INSERT INTO ranking_rank_data (rank, source_id, ranking_source_id) 
SELECT '1','2','3' 
FROM dual 
WHERE 
    NOT EXISTS(SELECT * 
      FROM ranking_rank_data 
      WHERE rank = '1' AND source_id = '1' AND ranking_school_id = '2') 

請參閱小提琴here

+0

非常感謝您的快速響應。花了我很長時間來試圖找出這個.. – Reza

0

爲什麼不使用INSERT ON DUPLICATE KEY UPDATE語法並在rank + source_id + ranking_school_id上設置唯一密鑰?如果您沒有任何「真正」更新,您可以更新虛擬字段。請參閱https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

您也可以嘗試插入它。它會在重複鍵上失敗,但你可以用你在MySQL上使用的編程語言來處理這個錯誤。

+0

我其實已經嘗試過。但我只想要一個條件,如果所有三個值都與插入值相同而不被插入,那麼這些字段的值都是唯一的。 – Reza

+0

我正在討論在多列上設置唯一鍵,而不是在每一列上。 – Capsule

+0

嗯,我明白了。天堂'試過了。 – Reza

0

您也可以通過創建三個值的唯一索引做到這一點:

create unique index on ranking_rank_data_rank_source_id_ranking_source_id on 
    ranking_rank_data(rank, source_id, ranking_source_id); 

這將避免重複。然後你可以插入記錄(或更新記錄),確信沒有重複。有兩種方法(除了not exists方法)來做到這一點。首先是insert ignore

INSERT IGNORE INTO ranking_rank_data (rank, source_id, ranking_source_id) 
SELECT '1','2','3'; 

這忽略所有錯誤,不只是重複的錯誤,所以我傾向於第二種方法,即用on duplicate key update

INSERT IGNORE INTO ranking_rank_data(rank, source_id, ranking_source_id) 
    SELECT '1','2','3' 
    ON DUPLICATE KEY UPDATE rank = values(rank); 

(該update語句是無糖op,忽略錯誤。)

相關問題