2010-02-07 28 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