2015-07-14 4 views
0

Прежде чем я отправлю свой вопрос, я хотел бы рассказать вам все, что это не дубликат this или that, так как я не хочу решать конкретную проблему, но я хочу понять ее , Читая docs, я вижу две очень интересные примеры аномалий относительно подзапросов внутри update команды:Обновление подзапроса обновления MySQL

  1. UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);

Ошибка является

Ошибка 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Сообщение = "Вы не можете указать таблицу целей 'x' для обновления в предложении FROM"

2.

SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1) 

Ошибка

ОШИБКА 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = «Эта версия MySQL не поддерживает«LIMIT & IN/ALL/ANY/НЕКОТОРЫЕ подзапрос ''

Глядя на первый пример, я могу сказать что обновление column2 из t1 может или не может изменить значения column1, например, из-за триггеров или если столбцы одинаковы. Однако мне интересно, почему MySQL бросает ошибку вместо того, чтобы обычно оценивать подзапрос или, по крайней мере, определять, возможно ли, что результат подзапроса будет изменен update во время выполнения команды? Что касается второго примера, я действительно не понимаю, почему MySQL не поддерживает этот синтаксис. Я считаю, что это ошибки MySQL, и я задаюсь вопросом, есть ли какой-либо график, когда они будут исправлены.

+0

Если вам не нужна помощь в переписывании запросов, что вы ожидаете от нас? Мы не привязаны к приоритетам и графику MySQL. – Barmar

+0

Я никого не жду. Я задал вопрос, так как считаю, что это интересно. Если кто-нибудь знает ответ, тогда мы все будем проинформированы об этом. Если я буду тем, кто найдет ответ в будущем, тогда я обязательно поделюсь. Вопрос, по общему признанию, сложный, но интересный. –

+0

@ Бармар, у меня недавно была такая проблема и она была решена, но мне было интересно узнать причины. –

ответ

0

MySQL является функционально ограниченной СУБД по сравнению с некоторыми другими СУБД. Эти ограничения не устраняются Oracle (владельцем MySQL) по нескольким причинам. Ограничения, о которых вы говорите, задокументированы MySQL. Есть пути вокруг этих вопросов Вы наблюдаете:

Пример замена для 1:

CREATE TEMPORARY TABLE ttt AS SELECT MAX(column1) col1 FROM t1; 
UPDATE t1 SET column2 = (SELECT col1 FROM ttt); 

Пример замена 2:

CREATE VIEW ttt2 AS SELECT s2 FROM t2 ORDER BY s1 LIMIT 1; 
SELECT * FROM t1 WHERE s1 IN (SELECT s2 ttt2); 

(как ни странно это работает, пока он синтаксический же .. .).

Дополнительно: Начните использовать MariaDB (на 100% обратную совместимость с MySQL) и внести вклад в этот проект. Они фиксируют некоторые долговременные проблемы с функциональностью.

+1

Он сказал, что не спрашивает, как переписывать запросы, чтобы они работали. – Barmar

+0

Норберт, я хотел бы поблагодарить вас за ваш ответ, однако, я решил свои проблемы с рабочими местами. Мне интересно узнать, почему эти проблемы существуют, как @Barmar предложил в предыдущем комментарии. –

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