Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, нужны советы или направить в нужное русло, вопрос в следующем:
Пример для понимания (таблица):
table_1
-----------
id int auto increment
id_store int
id_equipment int
count double
------------------
id_store- id определенного склада
id_equipment - id определенного оборудования
в этой таблице хранится связь склада с оборудованием и его количеством соответственно.
Вопрос:
Например приходит новое оборудование на определенный склад, скажем "склад_1", причем один тип оборудования уже имеется на этом складе и нужно только обновить количество единиц, а другого типа оборудования нету и нужно создать новые записи.
Я пришел только к этому мнению, сначала выгружать все оборудования с данного склада, и заносить их в массив.
Потом сравнивать этот массив с новым приходом где происходит деления на два вида запроса, 1) на insert 2) на update
Так вот можно ли обойти обработку массива, и состряпать такой запрос на языке mysql? какие методы могут помочь, еще мало знаю возможности этого языка, просьба помочь и подсказать, может какие-нибудь условия в нем есть..
Чтобы он сам разбирал какие ему нужно новые записи создать а какие сложить.
Неактивен
можно, посмотрите
http://dev.mysql.com/doc/refman/5.5/en/ … icate.html
Неактивен
Как я понял эта конструкция складывает если первичный ключ совпадает, или по уникальному(в данной задачи уникальный не допускается потому что в стобцах имеются одинаковые значения).
А задача стоит в том что если нет в двух столбцах одинаковых значений то создаем новое если есть то обновляем его содержимое
к примеру таблица:
a | b | val
1 | 1 | 1
1 | 2 | 1
и следует такое условие если а и b совпадает то обновляем значение val, если же нет то создаем новую строку
соответственно при Insert ... values (1,1,2),(1,3,3);
a и b совпадает складываем значение, а вот второе условие уже не совпадает нужно добавить новую строку..
в результате ответ:
a | b | val
1 | 1 | 3
1 | 2 | 1
1 | 3 | 3
В итоге имеются ли у Insert конструкции по условию?
или я чего то не понимаю..
Отредактированно Osi322 (25.07.2014 09:42:33)
Неактивен
Всё поняли правильно за исключением "в данной задачи уникальный не допускается".
Комбинация (id_store, id_equipment) и есть уникальный ключ в вашей задаче.
http://sqlfiddle.com/#!2/bb354/1
Неактивен
Спасибо большое за предоставленный рабочий пример.
Теперь понял как это работает.
Но есть еще вопросы на понимание.
Эта форма работает по primary key или уникальному. Как она определяет по какому именно? мы же не указываем явно по каким столбцам.
В данном примере я добавил еще 1 столбец и сделал его primary key с AI, и все работает так как по условию, но по идеи он должен же и по первичному ключу тоже сравнивать? а по факту только по двум уникальным.
То есть если нет уникальных эта конструкция будет работать только по первичному иначе же по уникальным? правильно понял?
И еще один нюанс, по первому Вашему ответу делал так как и Вы, но у меня ругался sql c с ошибкой Duplicate entry '1' for key 'a'. Таблицу создавал так(create table test (a int, b int, val int)) а ключи уникальные ставил в phpadmin.
Эта ошибка пропала после того как я удалил и снова создал таблицу как написали ВЫ "create table test (a int, b int, val int, unique key (a,b));".
Почему такая особенность, ведь это тот же самый ключ?
Неактивен
1. Эта конструкция работает по всем уникальным ключам (первичный это частный случай уникального и в данном контексте ничем не отличается).
2. Вероятно в пхпадмине вы делали индекс на отдельное поле "а", а в моем примере составной индекс на два поля. Посмотрите FAQ №5
Неактивен