Мускуль совет нужен.

12
malls
На сайте с 08.08.2005
Offline
255
875

Есть такая задачка, две таблицы, примерно одинаковые по сути:

tb1 (id, id2, id3, value)

tb2 (id, id2=tb1.id, id3, value)

т.е. вторая увязана с первой.

При этом id - в обоих случаях уникален, и в том числе уникальна комбинация id2+id3

получаю массив данных в виде: tb1(id2, id3, value), tb2(id2, id3, value).

т.е. все есть - кроме ключевых id.

Нужно (обновить поля) ИЛИ (добавить их если не существуют) в обе таблицы.

Размышляю:

1. управлять полями можно через WHERE id2 AND id3 - но это путь для одной записи.

2. Вставить ЛИБО обновить можно через INSERT INTO ... ON DUPLICATE KEY UPDATE ...

но оно для одной записи.

3. Обновить "пачку" можно через UPDATE SET id = case ... но это не решает проблему добавления.

Надеюсь не путано объяснил...

Короче пухнет головенка - как ОДНИМ ЗАПРОСОМ обновить ЛИБО добавить сразу множество записей в таблицу или в две, при условии что обращаться к записи нужно по двум полям одновременно.

DG
На сайте с 07.01.2007
Offline
53
#1

А почему нельзя добавлять по одной записе в цикле (и так сколько угодно раз)?

мой блог - заработок в сети (http://izombie.ru)
malls
На сайте с 08.08.2005
Offline
255
#2
DimoninG:
А почему нельзя добавлять по одной записе в цикле (и так сколько угодно раз)?

Допустим! Вопрос остается: как ЛИБО добавить ЛИБО заменить, если мы не знаем уникального индекса, а имеем только набор из id2 и id3.

Т.е. зная id2, id3 можно произвести замену: UPDATE ... WHERE ...

но если такая комбинация не встречается, т.е. нет записи с id2=ХХХ, id3=YYY, что делать?

X
На сайте с 21.08.2005
Offline
67
#3

Вам возможно помогут конструкции:

UPDATE ... WHERE id not in (SELECT id FROM ...)

INSERT INTO ... (SELECT .... FROM ... WHERE id not in (SELECT id FROM ...))

Создание, продвижение сайтов. Контекстная реклама. Разработка ПО. www.seop.ru (www.seop.ru)
malls
На сайте с 08.08.2005
Offline
255
#4

xmrz как?

т.е. если б можно было:

UPDATE ... WHERE ... [OR INSERT INTO ...]

тогда да... но так ведь не получится.

X
На сайте с 21.08.2005
Offline
67
#5

согласен, это придётся делать в два запроса. Например - сперва добавить данные которых нет, а потом обновить которые изменились

malls
На сайте с 08.08.2005
Offline
255
#6
xmrz:
согласен, это придётся делать в два запроса. Например - сперва добавить данные которых нет, а потом обновить которые изменились

тогда в три - нужен еще SELECT который подскажет нам какие записи уже есть...

Вот этого то и хочется избежать. Иначе сначала надо выбрать массив SELECTом - сравнить массивы, разделить исходный на (добавляем/обновляем) - и потом начать процесс. А если записей несколько миллионов? Тоже так же страдать?

X
На сайте с 21.08.2005
Offline
67
#7

Зачем три?

Хватит двух. Вот эта конструкция WHERE id not in (SELECT id FROM ...) позволит избежать третьего запроса. Когда я решал задачу массовой вставки данных в mysql с миллионами записей пришёл к выводу что дешевле создать ошибку PRIMARY KEY чем предварительно проверять, нет ли такой записи, быстрее выходит в разы :)

xmrz добавил 16.02.2009 в 11:56

да, предварительно рекомендуется вставить данные во временные таблички, а потом уже ими оперировать

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#8

malls, а чем REPLACE не устраивает в такой ситуации, он же как раз по уникальному ключу работает?

• Контекстные ссылки с внутренних страниц навсегда (/ru/forum/370882) • Качественные сайты для заработка на контекстной рекламе и ссылках
malls
На сайте с 08.08.2005
Offline
255
#9
xmrz:
Зачем три?

Хватит двух. Вот эта конструкция WHERE id not in (SELECT id FROM ...) позволит избежать третьего запроса. Когда я решал задачу массовой вставки данных в mysql с миллионами записей пришёл к выводу что дешевле создать ошибку PRIMARY KEY чем предварительно проверять, нет ли такой записи, быстрее выходит в разы :)

проблема в том что у меня на момент добавления НЕТУ id, есть только вторичные ключи!

Например:


| id | id2 | id3 | value |
------------------------------------------------------------
| 1 | Вася | характер | скверный |
| 2 | Петя | характер | сисадминский |
| 3 | Вася | лицо | глупое |
| 3 | Коля | лицо | кирпича просит |

Т.е. у меня есть значения:

(Петя , характер , исправился)

(Коля , характер , пива выпил) add

(Петя , лицо , задумчивое) add

(Вася , лицо , книжку прочитал)

(Миша , лицо, удивленное) add

соответственно надо некоторые поля добавить ( add), а некоторые изменить. Сочетание id2+id3 ВСЕГДА УНИКАЛЬНО! Но ключа id нету на момент добавления!

СКОРПИОН:
malls, а чем REPLACE не устраивает в такой ситуации, он же как раз по уникальному ключу работает?

тем и не устраивает!

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#10
malls:
Сочетание id2+id3 ВСЕГДА УНИКАЛЬНО!
<...>
тем и не устраивает!

Не понимаю. id2+id3 - уникален. Следовательно, при использовании REPLACE:

1. (Петя , характер , исправился) - запись будет замещена;

2. (Миша , лицо, удивленное) - запись будет создана.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий