1

Тема: MySQL запит з умовою (добавити або замінити запис)

Є таблиця: projects
поля:
typeObject // enum('ІТП','ЦТП','котельня') // not null // primary key       
addressObject // varchar(35) // not null // primary key           
pathDir    // varchar(100)           
dateChange // timestamp // not null // default CURRENT_TIMESTAMP // on update CURRENT_TIMESTAMP

Потрібен запит з умовою, якщо запис з відповідними значеннями в полях typeObject та addressObject є: змінюємо значення в полі pathDir, якщо запису з відповідними значеннями в полях typeObject та addressObject не має: добавляємо запис.

Написав ось такий запит:

INSERT INTO projects (typeObject, addressObject, pathDir) 
VALUES('ІТП', 'Дунайська, 61','схеми\\РТМ\\Дунайська, 61.docx') 
ON DUPLICATE KEY UPDATE pathDir='схеми\\РТМ\\Дунайська, 61.docx';

Начебто все добре, але при наявності відповідного запису та заміни значення в полі pathDir MySQL обробляє 2 записи!. Можливо MySQL спочатку видаляє запис, а потім створює новий тому і обробляє 2 записи чи я не правильно написав запит, підкажіть будь-ласка?!

2

Re: MySQL запит з умовою (добавити або замінити запис)

on duplicate key працює лише з ключами, які є unique, здається.

3

Re: MySQL запит з умовою (добавити або замінити запис)

Мені теж так здається.

4

Re: MySQL запит з умовою (добавити або замінити запис)

Я в MySQL не профі, але ж запит то виконуэться. Просто дивуэ те, що обробляэться 2 рядки!

5

Re: MySQL запит з умовою (добавити або замінити запис)

Покажіть результат запиту:

SELECT * FROM projects WHERE typeObject='ІТП' AND addressObject='Дунайська, 61';

6

Re: MySQL запит з умовою (добавити або замінити запис)

typeObject   ІТП
addressObject   Дунайська, 61
pathDir   схеми\РТМ\Дунайська, 61.docx
dateChange   2014-06-06 13:27:04

7

Re: MySQL запит з умовою (добавити або замінити запис)

Раджу переробити запит на конструкцію типу

IF EXISTS (SELECT * FROM projects WHERE typeObject='ІТП' AND addressObject='Дунайська, 61')
    UPDATE ...
ELSE
    INSERT INTO projects ...

8

Re: MySQL запит з умовою (добавити або замінити запис)

Дякую за пораду, але цікавить різниця між "моїм" запитом і "вашим". В чому плюси?

9 Востаннє редагувалося koala (06.06.2014 13:33:53)

Re: MySQL запит з умовою (добавити або замінити запис)

AFAIK, MySQL в підзапитах робить повну вибірку, тому бажано додавати LIMIT 1 - для швидкості.
А 2 записи - мабуть, тому, що спершу пробує INSERT, а потім UPDATE, от і виходить 2 операції. Можете спробувати створити binary log і почитати.
Ну і рідна конструкція (ON DUPLICATE KEY) безумовно краща швидша за IF-ELSE.

Подякували: fed_lviv2

10

Re: MySQL запит з умовою (добавити або замінити запис)

fed_lviv написав:

Дякую за пораду, але цікавить різниця між "моїм" запитом і "вашим". В чому плюси?

Читабельніше і дещо універсальніше, імго.

11

Re: MySQL запит з умовою (добавити або замінити запис)

fed_lviv написав:

Дякую за пораду, але цікавить різниця між "моїм" запитом і "вашим". В чому плюси?

Чи не тим, що другий запит працює як треба?

12

Re: MySQL запит з умовою (добавити або замінити запис)

Та "мій" запит теж справляється з поставленою задачею. Дивує обробка двох записів. Я в першому повідомленні писав свою думку, що до двох записів. А ось і думка koala, що до обробки двох записів, доречі більш схожа на правду. Тому все ж таки залишу свій запит без змін. Всім дякую за поради, підказки.
P.S. Запит від Bartasha залишу "прозапас" :)