在选择语句 MySQL 8 中自动增加临时列

Posted

技术标签:

【中文标题】在选择语句 MySQL 8 中自动增加临时列【英文标题】:Auto increment temporary column in select statement MySQL 8 【发布时间】:2020-08-31 15:54:41 【问题描述】:

你好,我使用这种类型的句子在我准备好的语句选择中返回一个自动增量列

cnt := cnt + 1

        SET @query = CONCAT('SELECT * FROM (SELECT (@cnt := @cnt + 1) AS id, a.idProducto idProducto, a.idExProducto idExterno, trim(a.descripcion) nombreProducto, trim(a.descripcionAlt) nombreLargoProducto, trim(a.serial) serial,',    
                        ' a.peso, a.volumen, a.IdTpoGrupo, trim(b.descripcion) nombreGrupo,',
                        ' a.idTpoLinea, trim(c.descripcion) nombreLinea,',                          
                        ' a.idTpoMarca, trim(d.descripcion) nombreMarca,', 
                        ' a.idTpoUnidad, trim(e.descripcion) nombreTipoUnidad,', 
                        ' CASE WHEN a._estado = 1 THEN ''true'' ELSE ''false'' END estado, ',  
                        ' g.nombreArchivo imagen ',  
                        ' FROM tblProducto a',          
                        ' INNER JOIN tblProducto_TpoGrupo b ON a.IdTpoGrupo = b.IdTpoGrupo',
                        ' INNER JOIN tblProducto_TpoLinea c ON a.idTpoLinea = c.idTpoLinea',
                        ' INNER JOIN tblProducto_TpoMarca d ON a.idTpoMarca = d.idTpoMarca',
                        ' INNER JOIN tblTpoUnidadMedida e ON a.idTpoUnidad = e.idTpoUnidadMed ',
                        ' LEFT JOIN tblProductoXImagen f ON a.idProducto = f.idProducto  AND f._estado=1',
                        ' LEFT JOIN tblImagen g on f.idImagen = g.idImagen AND g._estado=1',
                        ' WHERE a._estado<2 ',whereLike,whereConcat, ' order by idProducto ) allrecords');             
                        
                        
                        
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

这在 mysql 5 上完美运行,但现在在 MySQL 8 中已弃用,我的事务返回警告,但警告停止执行我的存储过程,我想知道是否有解决方案可以实现此行为MySQL 8.

感谢您的帮助。

【问题讨论】:

请向我们展示您的整个查询 - 或展示您想要实现的目标的最小可重现示例。 【参考方案1】:

您可以使用窗口函数。您想要的逻辑是:

row_number() over(order by idProducto) as id

这会给你一个递增的整数值,它从1 开始并根据idProducto 递增。如果结果集中的两行具有相同的idProducto,则不确定哪一行将被“第一”排序(但是,保证它们不会获得相同的行号)-在这种情况下,您可能想要在order by 子句中添加一列或多列,这样您就可以得到一个可预测的稳定结果。

【讨论】:

以上是关于在选择语句 MySQL 8 中自动增加临时列的主要内容,如果未能解决你的问题,请参考以下文章

mysql自动增加的字段怎么设置初始值

SQL篇章SQL语句梳理 :--基于MySQL5.6已梳理:ALTER TABLE解析

mysql整理

mysql如何创建临时表

数据库sql大字段占用临时表空间

使用 phpmyadmin 导入时在 mysql 中自动增加列