2010-02-07 60 views
1

有一個索引表。 (鏈接標籤與ID)。SQL:用幾條記錄替換(mysql)

REPLACE INTO com_index (word, ids) VALUES ('word1', concat(ids, ' 2')), ('word2', concat(ids, ' 2')) 

word是主鍵。

我試圖查看行,在其中存在的那些行中添加'0123'到ids;如果不是,則創建一個'2'的新行。

所以,我需要看看是否有任何這樣的字欄(word1或word2 ...)和concat'2'行給他的ID。如果沒有這樣的行(帶有word列) - 用ids ='2'創建它。

而且它是MySQL! (沒有子選擇)

+0

我認爲你想解決的問題的背景和一些混合具有示例輸入和輸出的示例會有所幫助。 – 2010-02-07 15:24:44

+0

有一個想法。插入IGNORE所有單詞。然後將它們全部更新。 – 2010-02-07 15:38:21

+0

有點核心:自4.1版以來,MySQL支持子查詢 – 2010-02-07 15:51:46

回答

1

一個非常簡單的解決方案是可能的,因爲word是主鍵*:

INSERT INTO `com_index` (word, ids) 
VALUES ('word1', '2'), ('word2', '2') 
ON DUPLICATE KEY UPDATE ids=concat(ids, ' 2') 

請務必檢查MySQL Manual for the INSERT ... ON syntax


*其實,還可以與其他種類的索引,只要它們是唯一的(這是與主鍵給出的

+0

謝謝,感覺這是這個問題的最佳解決方案。 – 2010-02-07 16:28:09

0

replace into插入或更新整行。我不認爲你可以使用它來執行取決於列的當前值的更新。

你能做到這一點的兩個語句,如:

UPDATE com_index SET ids = concat(ids,' 2') 
    WHERE word = 'word1' 
    AND ids <> '2'   -- Only 2 
    AND ids not like '2 %' -- Starts with 2 
    AND ids not like '% 2 %' -- 2 in the middle 
    AND ids not like '% 2'; -- 2 at the end 
INSERT INTO com_index (word, ids) 
    SELECT 'word1', '2' 
    FROM dual 
    WHERE NOT EXISTS (select * from com_index where word = 'word1'); 

正如你所看到的,存儲列表的列得到棘手快。考慮將com_index表拆分爲兩個具有外鍵關係的表。

+0

您已經理解我錯了。我的意思是「存在於他們中的那些人」 - 完全存在。所以,我需要看看是否有這樣的「字」列(「word1」或「word2」...)的任何行,並添加concat'2'給他們的'ids'。如果沒有這樣的行 - 創建它。 – 2010-02-07 15:34:27

+0

它是MySQL! (沒有子選擇) – 2010-02-07 15:36:17

+0

這就是這個代碼的作用?它修改一行,如果它存在,則創建它,如果它不存在。如果你不需要檢查'2',你可以從答案 – Andomar 2010-02-07 15:38:05