update if

Тема в разделе "Базы данных", создана пользователем contive, 8 окт 2012.

Модераторы: latteo
  1. contive

    contive Постоялец

    Регистр.:
    24 апр 2009
    Сообщения:
    117
    Симпатии:
    23
    Есть таблица:

    | id | name | hiredate | salary | award |
    | 1 | Ivan Ivanovich | 2012-08-29 00:25:57 | 800 | yes
    | 2 | Andrey Andreev | 2012-08-29 00:25:57 | 500 | yes
    | 3 | Victor Petechkin | 2012-08-29 00:25:57 | 1000 | no

    НУЖНО:
    Выполнить
    PHP:
    UPDATE salary FROM personal WHERE id AND hiredate =< NOW()
    если hiredate > NOW() выдать еррор с произвольным текстом.

    Как правильно составить запрос, помогите, пожалуйста.
     
  2. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    183
    Симпатии:
    75
    1. Синтаксис апдейта некорректен. Правильно будет:
    Код:
    UPDATE `personal` SET `salary` = 100 WHERE `id`=2 AND `hiredate` <= NOW() 

    2. Если нужны условия в UPDATE, то нужно использовать CASE. Однако, конструкция довольно громоздкая. Как-то вот так:
    Код:
    UPDATE `personal`
    SET `salary` =
        CASE
        WHEN ( `id` = 4 AND `hiredate` < NOW() ) THEN '500'
        WHEN ( `id` = 4 AND `hiredate` > NOW() ) THEN (
            -- Вот тут должна была бы быть ошибка
            '1000'
        )
        ELSE salary
    END
    

    Однако, есть проблема - отсутствует механизм, позволяющий вернуть ошибку. Чтобы всё это упаковать в один запрос, необходимо использовать хранимую процедуру и вызывать ее как CALL PROC_NAME(param1, param2). Внутри процедуры можно делать SIGNAL и возвращать ошибки. Данная штука будет работать только в MySQL 5.5+

    Поэтому в данном случае куда проще будет использовать SELECT IF и проверку возложить на приложение, разделив необходимое на два запроса - проверку и update если проверка пройдена.
     
    latteo нравится это.
  3. ant0ni0

    ant0ni0 Писатель

    Регистр.:
    24 июл 2012
    Сообщения:
    9
    Симпатии:
    2
    можно что сделать - отслеживать ROW_COUNT() - и если вернулось 0 значить update не прошел (хотя он не пройдёт и в случае левого ИДшника, но этот случай менее вероятен)
    или stored procedure написать для такого и там уже поднимать исключение
     
    latteo нравится это.
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.725
    Симпатии:
    2.100
    там скорее всего проверка, чтоб дата не была в будущем? в даном случае дествительно, правильнее будет разбить запрос на два и перестроить апликуху, чтоб не посылала апдейта когда первая проверка не прошла.
     
  5. unknown34

    unknown34 Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    19
    Симпатии:
    2
    мне кажется, вы неправильно подходите к задаче. более логично и понятно было бы сначала сделать select на тех, кто не подходит для обновления, сохранить его куда то (уже не на стороне СУБД), потом сделать update с правильными условиями.