Есть такой SQL запрос:
INSERT INTO db (name,f,link,time) VALUES ('%name%','%price%','%link%','%date%');
(name - PRIMARY KEY)
Задача такая. Дополнить запрос таким образом, что бы в "f" и "time" добавлялись новые данные, не перезапись новыми, а именно добавлялись.
Так например при первом запрос
f=text1
time=15:58:00
При втором
f=text2
time=15:59:00
Результат
f=text1|text2
time=15:58:00|15:59:00
Вы можете со мной не согласиться, но как бы вам не хотелось - делать это неправильно. Вы скорее всего еще мало понимаете в предметной области и хотите быстро решить проблему. Если и делать так, то делать это не при insert (инсерт всегда добавляет строку), а при update. И делать это можно через триггер
CREATE TRIGGER `my_super_trigger` before update ON `table_name`
FOR EACH ROW BEGIN
SET NEW.f = CONCAT(OLD.f, '|', NEW.f);
END;
Т.е. теоретически ваша цель достижима, но делать так скорее всего в вашей задаче - не верно. Т.е. делать надо как-то иначе, по ситуации.
PS А ответ Timur Milovanov про INSERT INTO...ON DUPLICATE KEY UPDATE... еще лучше!
В некоторых СУБД (например Oracle) существуют INSTEAD OF TRIGGER
которые можно навесить на представления (VIEW
) и вместо INSERT INTO VIEW_NAME ...
делать UPDATE BASE_TABLE ...
, НО:
INSTEAD OF TRIGGERS
"Каждое пересечение строки и столбца содержит ровно одно значение из соответствующего домена (и больше ничего)"
- с ростом БД и нагрузки это вылезет в непреодолимые, искусственно созданные проблемы. Самое неприятное в этом подходе - это то, что вначале все замечательно работает, а когда начинаются проблемы, то приходится менять слишком много всего как в БД, так и в приложениях, чтобы от этого косяка полноценно избавиться. Не забываем еще о предстоящей миграции этих данных в нормальное представление. В общем я по работе уже несколько раз сталкивался с таким подходом и каждый раз это рано или поздно превращалось в серьезную проблему.Вывод: используйте реляционную БД как реляционную БД и не надо пытаться использовать программистские шаблоны в БД если они не совместимы с ее идеологией.
Для описанной проблемы не очень подходит СУБД. Как минимум потому что INSERT
логически должен всегда добавлять запись, UPDATE
... ну, вы поняли.
Класические приёмы аудита на уровне СУБД предполагают вставку в отельную таблицу значений полей ДО/ПОСЛЕ UPDATE
-изменения. Эти приёмы можно сделать через триггеры (описано с соседнем ответе).
Также можно посмотреть на конструкцию INSERT INTO...ON DUPLICATE KEY UPDATE...
(похоже на Oracle#merge). Но в mysql там есть особенности (описаны здесь)
INSERT INTO db (name, f, link, time) VALUES
('%name%','%price%','%link%','%date%')
ON DUPLICATE KEY UPDATE
f = CONCAT(f, '|', VALUES(f)), time = CONCAT(time, '|', VALUES(time));
Но полностью поддерживаю предыдущих ораторов, что так делать не стоит
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как в таблице dle_post_extras проставить рандомное число от 500 до 10000 в столбец rating в каждую ячейку?
Как сделать адапативные кнопки, при увеличении размера экрана, все кнопки разлетаютсяВот код
Всем приветВ коде ниже есть два массива - один со значениями, другой используется для счетчика