Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Если есть то обновить, иначе добавить, Вопрос новичка 
:(
    Опции темы
Parallelogram
Дата 10.10.2015, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.1.2013

Репутация: нет
Всего: нет



У меня есть таблица вида: NOMER COD. Нужно проверить, если телефон уже есть в базе, то обновить COD, если нет в базе, то создать запить телефон - код. У меня получается что-то подобное сделать с помощью циклов в php, но лучше бы сделать это одним запросом или с помощью триггера.
PM MAIL   Вверх
Parallelogram
Дата 10.10.2015, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.1.2013

Репутация: нет
Всего: нет



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

IF (SELECT * FROM `wi_tel_cod` WHERE EXISTS (`tel` = 1234567890)) 
    BEGIN 
        UPDATE `wi_tel_cod` 
        SET `cod` = 4321
        WHERE `tel` = 1234567890 
    END 
ELSE 
    BEGIN 
        INSERT  INTO `wi_tel_cod` 
        VALUES('1234567890', '4321') 
    END 

И такой не работает
Код

begin
    IF (SELECT * FROM `wi_tel_cod` WHERE `tel`='1234567890') THEN
        UPDATE `wi_tel_cod`    SET `cod`='8765' WHERE `tel`='1234567890';
    ELSE
        INSERT INTO `wi_tel_cod` VALUES ('1234567890', '4321');
    END IF;
end


Это сообщение отредактировал(а) Parallelogram - 10.10.2015, 07:12
PM MAIL   Вверх
tzirechnoy
Дата 10.10.2015, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Код
REPLACE wi_tel_cod (tel, cod) VALUES ('1234567890', '4321')



tel, разумеется, должэн обладать уникальным индэксом.
PM MAIL   Вверх
Parallelogram
Дата 10.10.2015, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.1.2013

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 10.10.2015,  11:10)
Код
REPLACE wi_tel_cod (tel, cod) VALUES ('1234567890', '4321')



tel, разумеется, должэн обладать уникальным индэксом.

А если я создам еще 1 столбец, например 'id' с ним такой фокус пойдет? Пусто он будет уникальным идентификатором. Просто tel может повторяться.

P.s.: Не работает( Просто создает дубликат.

Это сообщение отредактировал(а) Parallelogram - 10.10.2015, 15:57
PM MAIL   Вверх
tzirechnoy
Дата 11.10.2015, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Просто tel может повторяться.


То есть оно у тебя не в первой нормальной форме? Поскольку в таблицэ только номер и код, номер можэт повторяться, код ты принудительно у всех записей с одним номером обновляешь при некоторых условиях.

Ну, фигово тогда, чо. Сделай нормально пока не поздно.
PM MAIL   Вверх
a0730
Дата 11.10.2015, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата

   Просто tel может повторяться.
   


зачем хранить несколько одинаковых записей?

Либо расскажи про задачу подробнее.
Например, почему телефон может повторяться и какие значения принимает код в таких случаях.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akina
Дата 11.10.2015, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Parallelogram @  10.10.2015,  06:49 Найти цитируемый пост)
Нужно проверить, если телефон уже есть в базе, то обновить COD, если нет в базе, то создать запить телефон - код.

В MySQL есть для этого специальное INSERT ... ON DUPLICATE KEY UPDATE ..., обеспечивающее полный контроль за процессом, и его более простой аналог REPLACE  - с минимальным функционалом.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tzirechnoy
Дата 12.10.2015, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
В MySQL есть для этого специальное INSERT ... ON DUPLICATE KEY UPDATE


При полном отсутствии UNIQUE это не поможэт ни капли.
PM MAIL   Вверх
Akina
Дата 12.10.2015, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Пусть добавит.  


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_zorn_
Дата 16.10.2015, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 2
Всего: 12



Цитата(Akina @  12.10.2015,  04:35 Найти цитируемый пост)
и его более простой аналог REPLACE

Не надо вводить людей в заблуждение. REPLACE это НЕ аналог ON DUPLICATE KEY UPDATE. 
REPLACE тупо удаляет запись перед вставкой если конфликт по ключу, ON DUPLICATE KEY UPDATE обновляет указанные поля.
Чем чревато ?
Например есть поле TIMESTAMP с дефолтным значением CURRENT_TIMESTAMP. Это поле никто не изменяет никогда, но какая нибудь логика на него завязана. 
При REPLACE оно всегда будет NOW()...
PM MAIL   Вверх
Akina
Дата 16.10.2015, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(_zorn_ @  16.10.2015,  16:54 Найти цитируемый пост)
REPLACE это НЕ аналог ON DUPLICATE KEY UPDATE. 

Вот было бы странно, если бы они были полными аналогами, верно?

В основе своей они аналогичны, потому что выполняют одну и ту же операцию - вставку записи с контролем ненарушения условий уникальности, причём не нарушающая уникальная запись вставляется, а а нарушающая неуникальная обновляется. 

Всё остальное - детали, которые и составляют разницу, у одного оператора базой является существующая запись, а у другого вставляемая. И описанный сценарий - одно из следствий наличия этой разницы. Точно так же эти различия приведут и к иным несовпадающим последствиям - скажем, к тому, что по-разному на вторичное действие сработают триггеры, и пр.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_zorn_
Дата 17.10.2015, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 2
Всего: 12



Просто я разок споткнулся когда заюзал АНАЛОГ. Поэтому и говорю что нельзя СОВЕТОВАТЬ что REPLACE это аналог ON DUPLICATE KEY UPDATE
Он работает ПО ДРУГОМУ. В моем случае было АБСОЛЮТНО по другому.
И если метод не работает ТАК ЖЕ то это НЕ аналог.
Кстати про триггеры. На ON DELETE в теории должны срабатывать на REPLACE, но не проверял.
PM MAIL   Вверх
Akina
Дата 18.10.2015, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(_zorn_ @  17.10.2015,  11:35 Найти цитируемый пост)
Он работает ПО ДРУГОМУ. 

Да никто с этим не спорит.

Цитата(_zorn_ @  17.10.2015,  11:35 Найти цитируемый пост)
споткнулся когда заюзал АНАЛОГ.

Вот этим и отличаются "аналог" и "эквивалент". Но зачастую критичен итог, а не путь его достижения. 
Тебе просто не повезло - итог получался не тот. 

Цитата(_zorn_ @  17.10.2015,  11:35 Найти цитируемый пост)
про триггеры. На ON DELETE в теории должны срабатывать на REPLACE, но не проверял. 

Да. 
ON DUPLICATE KEY UPDATE - всегда срабатывает триггер ON INSERT, а при дублировании ещё и ON UPDATE. 
REPLACE - всегда срабатывает триггер ON INSERT, а при дублировании ещё и ON DELETE, после чего повторно срабатывает ON INSERT.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.