MySQL警告:#1287不赞成在表达式中设置用户变量,在将来的发行版中将删除

kjthegm6  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(517)

在数据库中添加新行后,我使用此查询按日期重写id number列。即使查询运行良好,我也无法修复查询末尾显示的错误。有什么建议吗?

SET @ROW = 0;
 UPDATE `mytable` SET `id` = @ROW := @ROW+1 ORDER BY `date` ASC;

Warning: #1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.
我尝试修改查询

set id = "0";
 UPDATE `mytable` SET := id+1 ORDER BY `data` ASC;

但没有成功。

l7wslrjt

l7wslrjt1#

用户变量大多被MySQL 8.0中的窗口函数所取代。
您可以使用row_number()update/join语法来满足您的要求:

update mytable t
inner join (select id, row_number() over(order by date, id) new_id from mytable) t1
  on t.id = t1.id
set t.id = t1.new_id

Demo on DB Fiddlde
这里假设id是一个唯一的开始键。
我仍然会质疑为什么需要更改看起来像代理主键的内容。您可以在查询中动态计算行号,或者使用视图:

create view myview as
select t.*, row_number() over(order by date, id) new_id from mytable t

Demo on DB Fiddlde

相关问题