Обновить столбец значением другого столбца, который сам обновляется все в том же ОБНОВЛЕНИИ - PullRequest
0 голосов
/ 07 ноября 2018

Считайте, что это ОБНОВЛЕНИЕ-заявление:

UPDATE tbl_book 
SET return_date = planned_return_date, 
    planned_return_date = null 
WHERE book_id = 12;

Я думаю, это обновление работает так:

  1. найдите запись в таблице tbl_book , где идентификатор совпадает, и установите значение
  2. дата возврата до значения планируемая дата возврата
  3. и после этого , установите значение запланированного_датчика в NULL

Правильно ли мое предположение? Важен ли порядок SET-Clauses? Я бы даже предположил, что ссылка на столбец в присваивании всегда будет отражать значение «старых» записей, верно? В этом случае порядок не имеет значения ...

Редактировать 2018-11-08: Просто чтобы уточнить, я пометил свой запрос с помощью mysql и postgresql, поскольку мне нужно знать ответ для обоих.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Ваш запрос:

UPDATE tbl_book 
    SET return_date = planned_return_date, 
        planned_return_date = null 
    WHERE book_id = 12;

При выполнении update думайте о таблице как о двух версиях каждой записи - давайте назовем их «старая» и «новая», потому что это общая терминология, используемая в триггерах.

Значение set в новой записи. Значения на другой стороне = взяты из старой записи.

0 голосов
/ 07 ноября 2018

Согласно стандарту SQL, он не должен не использовать обновленные значения ни в одном из этих выражений. Соответствующий текст из спецификации 2003 1 гласит:

<update source> каждого <set clause> эффективно оценивается для каждой строки T перед обновлением любой строки T.

Где <update source> - часть справа от каждого оператора присваивания в предложении SET.

Может показаться, что MySQL здесь может не соответствовать стандарту, но я считаю, что PostgreSQL и большинство других продуктов баз данных будут. Для MySQL это задокументировано :

Второе присваивание в следующем операторе устанавливает col2 текущим (обновленным) col1 значением, а не исходным col1 значением. В результате col1 и col2 имеют одинаковое значение. Это поведение отличается от стандартного SQL.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

(Мой Акцент )


1 Раздел 14.11 <update statement: searched> Фонда. Выбор стандарта 2003 года был произвольным, я не думаю, что он сильно изменился между версиями стандарта.

0 голосов
/ 07 ноября 2018

Важен ли порядок пунктов SET? Да, порядок - это вопрос (для mysql), здесь причина, если вы выполните запрос ниже, то

create table t 
(
id int, id1 int, id2 int
);
insert into t 
values 
(1,2,3),
 (1,2,4);
select * from t;

update t 
set id2=null,
id1=id2

where id1=2;
select * from t

вывод будет

id id1 id2
1  null null
1  null null

но если вы это сделаете, то выход будет ниже

update t 
set 
id1=id2,
id2=null

id id1 id2
1  3   null
1  4   null

Так что порядок - это вопрос в множестве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...