Как дополнить SQL запрос?

226
08 августа 2018, 11:30

Есть такой 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

Answer 1

Вы можете со мной не согласиться, но как бы вам не хотелось - делать это неправильно. Вы скорее всего еще мало понимаете в предметной области и хотите быстро решить проблему. Если и делать так, то делать это не при 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... еще лучше!

Answer 2

В некоторых СУБД (например Oracle) существуют INSTEAD OF TRIGGER которые можно навесить на представления (VIEW) и вместо INSERT INTO VIEW_NAME ... делать UPDATE BASE_TABLE ..., НО:

  1. ЕМНИП MySQL не поддерживает INSTEAD OF TRIGGERS
  2. ваша модель данных нарушает одно из главных правил первой нормальной формы: "Каждое пересечение строки и столбца содержит ровно одно значение из соответствующего домена (и больше ничего)" - с ростом БД и нагрузки это вылезет в непреодолимые, искусственно созданные проблемы. Самое неприятное в этом подходе - это то, что вначале все замечательно работает, а когда начинаются проблемы, то приходится менять слишком много всего как в БД, так и в приложениях, чтобы от этого косяка полноценно избавиться. Не забываем еще о предстоящей миграции этих данных в нормальное представление. В общем я по работе уже несколько раз сталкивался с таким подходом и каждый раз это рано или поздно превращалось в серьезную проблему.

Вывод: используйте реляционную БД как реляционную БД и не надо пытаться использовать программистские шаблоны в БД если они не совместимы с ее идеологией.

Answer 3

Для описанной проблемы не очень подходит СУБД. Как минимум потому что INSERT логически должен всегда добавлять запись, UPDATE... ну, вы поняли.

Класические приёмы аудита на уровне СУБД предполагают вставку в отельную таблицу значений полей ДО/ПОСЛЕ UPDATE-изменения. Эти приёмы можно сделать через триггеры (описано с соседнем ответе).

Также можно посмотреть на конструкцию INSERT INTO...ON DUPLICATE KEY UPDATE... (похоже на Oracle#merge). Но в mysql там есть особенности (описаны здесь)

Answer 4
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));

Но полностью поддерживаю предыдущих ораторов, что так делать не стоит

READ ALSO
Выставить рандомное значение в Mysql

Выставить рандомное значение в Mysql

Как в таблице dle_post_extras проставить рандомное число от 500 до 10000 в столбец rating в каждую ячейку?

181
Не могу найти ошибку в слайдере

Не могу найти ошибку в слайдере

Перестали листиаться слайды

180
Как сделать адаптивные кнопки?

Как сделать адаптивные кнопки?

Как сделать адапативные кнопки, при увеличении размера экрана, все кнопки разлетаютсяВот код

210
Vue.js - как сделать функции, добавленные с новым элементом, независимыми друг от друга

Vue.js - как сделать функции, добавленные с новым элементом, независимыми друг от друга

Всем приветВ коде ниже есть два массива - один со значениями, другой используется для счетчика

141