SQL: заменить несколько записей (MySQL) - PullRequest
1 голос
/ 07 февраля 2010

Есть таблица индексов. (Связывает теги с идентификаторами).

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

word - это первичный ключ.

Я пытаюсь просмотреть строки, добавьте '2' к ids в тех из них, которые существуют; и создайте новую строку с '2', если это не так.

Итак, мне нужно посмотреть, есть ли строка с таким столбцом слов (word1 или word2 ...) и указать '2' для их идентификаторов. А если таких строк нет (с таким столбцом word) - создайте его с помощью ids = '2'.

И это MySQL! (нет вложенных элементов)

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

Очень простое решение, которое возможно, потому что word является первичным ключом *:

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

Обязательно проверьте Руководство MySQL для синтаксиса INSERT ... ON


* на самом деле, это также возможно с другими видами индексов, если они уникальны (что дается с помощью первичного ключа

0 голосов
/ 07 февраля 2010

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 на две таблицы с отношением внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...