update if

contive

Постоялец
Регистрация
24 Апр 2009
Сообщения
122
Реакции
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 = 2 AND hiredate =< NOW()
если hiredate > NOW() выдать еррор с произвольным текстом.

Как правильно составить запрос, помогите, пожалуйста.
 
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 если проверка пройдена.
 
можно что сделать - отслеживать ROW_COUNT() - и если вернулось 0 значить update не прошел (хотя он не пройдёт и в случае левого ИДшника, но этот случай менее вероятен)
или stored procedure написать для такого и там уже поднимать исключение
 
1. Синтаксис апдейта некорректен. Правильно будет:
Код:
UPDATE `personal` SET `salary` = 100 WHERE `id`=2 AND `hiredate` <= NOW()
Поэтому в данном случае куда проще будет использовать SELECT IF и проверку возложить на приложение, разделив необходимое на два запроса - проверку и update если проверка пройдена.

там скорее всего проверка, чтоб дата не была в будущем? в даном случае дествительно, правильнее будет разбить запрос на два и перестроить апликуху, чтоб не посылала апдейта когда первая проверка не прошла.
 
Есть таблица:

| 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 = 2 AND hiredate =< NOW()
если hiredate > NOW() выдать еррор с произвольным текстом.

Как правильно составить запрос, помогите, пожалуйста.
мне кажется, вы неправильно подходите к задаче. более логично и понятно было бы сначала сделать select на тех, кто не подходит для обновления, сохранить его куда то (уже не на стороне СУБД), потом сделать update с правильными условиями.
 
Назад
Сверху