Mysql Создать если не существует иначе обновить

SnowWind

Новичок
Всем привет.
Есть таблица table (id, goods, country, price)
Добавляю в неё данные с проверкой существования goods, если поле существует - обновляю определённые поля.


INSERT INTO $bd (goods, country, price)
VALUES ('$v1', '$v2', '$v3')
on duplicate key update bid = values(country), ask = values(price)


Позже решил добавить в базу товары из других стран, решил сделать так table (id, goods, country, price, country2, price2) получилась какая-то хренотня, потом разделил таблицу на 3
goods(id, name, desctription), country(idCountry, country) и prices(idPrices, price) связал их между собой по ключам id, idCountry и idPrices
и вот теперь вопрос, как модифицировать мой запрос к базе что бы вставить данные в 3 таблице, либо обновить country и price, если name существует?
 

SnowWind

Новичок
prices(idPrices, price) это на фига ?

Цены обычно бывают
1. не указана
2. бесплатно
3. по запросу
4. от ...
5. от .. до ..
6. до ..
7. точная цена

4 - 7
а) уточняется валюта в которой указана цена
б) единица измерения

итого в базе нужно
тип цены ; цена1; цена2; валюта; единица_измерения
ну в цена1; цена2 в зависимости от типа заполняется так чтобы запросы поиска по диапазону были простейшими
Так вопрос в другом, как добавлять данные в 3 таблицы, если нужно проверять существование товара в 1ой?
INSERT INTO $bd (goods, country, price)
VALUES ('$v1', '$v2', '$v3')
on duplicate key update country = values(country), price = values(price)
Этот запрос проверял существование goods т.к поле уникальное, если его нет, то добавлял новую строку, а если есть обновлял другие поля, а теперь эти другие поля в 2х других таблицах, как их обновлять?
 

AnrDaemon

Продвинутый новичок
Никак. Не должно быть одновременного обновления даже двух таблиц. Или у тебя схема БД в принципе неверна.
 

fixxxer

К.О.
Партнер клуба
главный минус - автоинкрементное поле увеличивается даже в случае срабатывания апдейта.
Не могу себе представить ситуацию, в которой это было бы проблемой. Даже если подобный запрос выполняется 100 раз в секунду, bigint-а хватит на века.
 

SnowWind

Новичок
так, пример про товар страну и цену - это сферический конь ?
тебе именно нужно вставить запись в таблицу с автоматической обработкой таксономинации (когда строковый литерал меняется на его идентификатор) на сервере ?
или поймешь что неправильно подходишь к исходной задаче ?

страны вообще можно рассматривать как условно константными (т.е. при вставке нового значения в таблицу генерить рнр файл)
Код:
function getCountyId(string $name){
  $ids = [
     'Россия' => 1,
    'США' =>2,
  ];
  return $ids['name'];
}
Не понимаю почему не правильно, изначально была 1 таблица table (id, goods, country, price), добавлял в неё строки 0 Телевизор Россия 1000, затем добавил в неё ещё 1 страну Китай и пришлось таблицу изменить 0 Телевизор Россия 1000 Китай 800, но если добавить ещё стран, то получается как-то не симпатично, поэтому решил сделать нормализацию таблицы и стало их 3 goods(id, name, desctription), country(idCountry, country) и prices(idPrices, price)
Но поскольку мне не нужно добавлять в базу строку, если она там уже есть, а просто обновить - я использовал on duplicate key update, но после нормализации таблиц стало 3, а необходимость в добавлении или обновлении осталась и тут я не знаю как это сделать :)
 

AnrDaemon

Продвинутый новичок
У тебя вообще не должно быть ни "телевизор" ни "россия" в этой таблице.
 

AnrDaemon

Продвинутый новичок
Оно проблему в принципе убирает, так как она перестаёт существовать.
Товары - это словарь. Отдельный словарь.
Страны - это словарь. Отдельный. Да.
А как вы их будете объединять - ваше личное дело.
 

SnowWind

Новичок
Оно проблему в принципе убирает, так как она перестаёт существовать.
Товары - это словарь. Отдельный словарь.
Страны - это словарь. Отдельный. Да.
А как вы их будете объединять - ваше личное дело.
Что-то я видимо совсем тугой или как :(
Как я эти словари буду заполнять данными? Проблема в том, что товары, страны и цены, они все наполняются данными, а в зависимости от того, есть ли уже товар в таблице Товары, они должны все обновиться.
 

AnrDaemon

Продвинутый новичок
Заполнять желательно молча.
Словари не обновляются! (Если только определение не меняется, что бывает редко.)
 
Так вопрос в другом, как добавлять данные в 3 таблицы, если нужно проверять существование товара в 1ой?
I
твой алгоритм действий таков.. 1-вначале выбираешь существ. строки из таблицы конструкцией SELECT
2. После того , как SELECT вернет тебе масив данных.. проверяешь методами пхп для работы с массивами (array_search() к примеру) или станд. условным оператором if.. пресутствует ли данный товар в тех данных, что в массиве.
3. Если пресутствует - используешь оператор UPDATE
4. Если не присутствует - используешь оператор INSERT

т.е. для твоей операции нужно как минимум 2 запроса к базе данных. за один запрос данную проверку не выполнить. Вначале выбираешь существующие строки из таблицы.. проверяешь результат выборки и затем в зависимости от результата проверки отправляешь нужную sql комманду INSERT или UPDATE

обьединять результаты выборки из 2х таблиц можно оператором JOIN

вот тебе неплохой онлайн справочник по SQL синтаксису http://2sql.ru и вот еще http://www.spravkaweb.ru/mysql

и лучше всего использовать обьектный стиль пхп синтаксиса для работы с БД и использовать встрренный в пхп класс MYSQLI смотри в справочнике на php.net

будешь sql гуру!))

синтаксис писать спец. не буду.. сам напиши и проверь
 
Последнее редактирование:
Сверху