2016-01-29 3 views
3

Если у меня есть оператор UPDATE, где я делаю SET p.old_email = u.email, u.email = NULL, будет ли p.old_email = u.email всегда происходить до u.email = NULL? Причина, по которой я спрашиваю, я не наблюдаю такого поведения.Порядок приоритета UPDATE для обновления нескольких таблиц

mysql> SHOW TRIGGERS; 
UPDATE 
Empty set (0.01 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_username = NULL, p.username = 'myusername', 
    -> p.old_email = NULL, u.email = '[email protected]', 
    -> e.record_status = 'inactive', e.date_modified = NOW(), e.modified_by_id =506836355 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
Query OK, 3 rows affected (0.00 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+------------+-----------+---------------------+ 
| old_username | username | old_email | email    | 
+--------------+------------+-----------+---------------------+ 
| NULL   | myusername | NULL  | [email protected] | 
+--------------+------------+-----------+---------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_username = p.username, p.username = NULL 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735Query OK, 1 row affected (0.00 sec); 

Rows matched: 1 Changed: 1 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+----------+-----------+---------------------+ 
| old_username | username | old_email | email    | 
+--------------+----------+-----------+---------------------+ 
| myusername | NULL  | NULL  | [email protected] | 
+--------------+----------+-----------+---------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_email = u.email, u.email = NULL 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 2 Changed: 1 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+----------+-----------+-------+ 
| old_username | username | old_email | email | 
+--------------+----------+-----------+-------+ 
| myusername | NULL  | NULL  | NULL | 
+--------------+----------+-----------+-------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_username = NULL, p.username = 'myusername', 
    -> p.old_email = NULL, u.email = '[email protected]', 
    -> e.record_status = 'inactive', e.date_modified = NOW(), e.modified_by_id =506836355 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
Query OK, 2 rows affected (0.00 sec) 
Rows matched: 3 Changed: 2 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+------------+-----------+---------------------+ 
| old_username | username | old_email | email    | 
+--------------+------------+-----------+---------------------+ 
| NULL   | myusername | NULL  | [email protected] | 
+--------------+------------+-----------+---------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_username = p.username, p.username = NULL, 
    -> p.old_email = u.email, u.email = NULL, 
    -> e.record_status = 'inactive', e.date_modified = NOW(), e.modified_by_id =506836355 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
Query OK, 2 rows affected (0.00 sec) 
Rows matched: 3 Changed: 2 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+----------+-----------+-------+ 
| old_username | username | old_email | email | 
+--------------+----------+-----------+-------+ 
| myusername | NULL  | NULL  | NULL | 
+--------------+----------+-----------+-------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> 
+0

Очевидно, что вы предпочтете сделать это таким образом, потому что вам не нужно создавать другое обновление, но есть ли другая причина, по которой вы бы просто не выполняли два отдельных обновления, чтобы это сделать? – Neil

+0

@Neil Не совсем, но я хотел бы понять, что происходит. – user1032531

ответ

2

От MySQL documentation:

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

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

однотабличное UPDATE назначение, как правило, вычисляется слева направо. Для обновлений с несколькими таблицами нет гарантии, что назначения выполняются в любом конкретном порядке.

Выполняется обновление нескольких таблиц, а назначение столбцов происходит не в определенном порядке, как указано в документации.

+0

Но, как видно из кода, который я опубликовал, 'u.email' не' NULL' перед обновлением. – user1032531

+0

Я не вижу, где ваше замешательство, все выглядит хорошо для меня. –

+0

Вы посмотрели на запрос SELECT, я отобразил 'email', а затем следующий запрос, где я установил' old_email = email'? Как видно, '' письмо не является NULL перед запросом UPDATE. Не выглядит хорошо для меня :( – user1032531

Смежные вопросы