Mysql автоматическое увеличение пользовательской переменной на лету - PullRequest
0 голосов
/ 24 марта 2020

В моем sql, если я напишу следующий код, SELECT *, @i:=@i+1 AS index FROM table, я могу получить столбец индекса auto_increment, начиная с 1.

Я просто хочу понять обоснование этого запроса. Почему оператор select здесь может работать как "L oop" до l oop во всех строках?

Cheers

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Мне потребовалось много времени, чтобы понять это. И некоторые читают официальную документацию, на самом деле не указывает, как, но как только я знаю использование @ и :=, я могу понять, как это работает.

@ для Пользовательские переменные
:= для operator_assign-value

Итак, первым шагом было назначьте значение переменной по умолчанию для запущенного «автоинкремента», введя:

SET @i := 0;

Затем в запросе вы просто напишите:

SELECT @i:=@i+1;

Давайте разберем это. На первом этапе я назначил @i значение равным 0. Если я напишу SELECT @i; после того, как я их установлю, он обязательно вернет 0, так как я уже назначил его. Затем я go на следующий запрос, который используется, дает значение "автоинкремент". Что заставляет меня спрашивать, если я устанавливаю переменную @i как 0, разве она не должна снова вернуть назначенное значение в следующей строке? Что ж, если вы оглянетесь на запрос, он на самом деле переназначает переменную @i:

enter image description here

У меня также есть подготовленный пример скрипки с некоторыми пояснениями.

Это может быть не так, как это официально работает, но я так понимаю.

0 голосов
/ 24 марта 2020

Логическое обоснование тому, что mysql реализовал это таким образом. @i:=@i+1 является выражением, и все выражения рассчитываются во всех записях, в противном случае они не будут возвращать правильное значение. Пользовательские переменные сохраняют свои значения в активном соединении, поэтому вы получаете поведение, подобное автоматическому приращению, таким образом.

Примечание Pls, документация mysql по пользовательским переменным упоминает, что этот синтаксис устарел и, вероятно, будет удален из будущих версий:

Предыдущие выпуски MySQL позволяли присваивать значение пользовательской переменной в операторах, отличных от SET. Эта функциональность поддерживается в MySQL 8.0 для обратной совместимости, но подлежит удалению в будущем выпуске MySQL.

Вы можете использовать оконные функции (rank и dens_rank) для достижения того же результата от v8.

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