【问题标题】:Warning on setting variable in MYSQL 8.0在 MYSQL 8.0 中设置变量的警告
【发布时间】:2020-07-31 15:55:28
【问题描述】:

我收到以下查询的弃用错误,我似乎无法找出正确的语法。

SELECT case_id, start_date, end_date,
@calc_end_date:= COALESCE(actual_end_date, end_date, CURDATE()),
DATE_SUB(@calc_end_date,INTERVAL 5 day) AS ending_soon
FROM authorizations;

查询有效,但我收到以下警告: 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)'.

我试过了(为简单起见,省略了部分查询):

SELECT case_id, start_date, end_date,
(SELECT COALESCE(actual_end_date, end_date, CURDATE()) FROM authorizations INTO @calc_end_date)
FROM authorizations;

还有:

SELECT case_id, start_date, end_date,
(SET calc_end_date = COALESCE(actual_end_date, end_date, CURDATE()))
FROM authorizations;

两者都不起作用。我做错了什么?

【问题讨论】:

  • 查询中嵌入的使用变量一直是粗略的,所以当它们消失时我不会错过它们。会话变量仍然存在,这就是消息告诉您的内容。但是,如果您的 SELECT 返回许多行,您希望从哪一行执行变量赋值?
  • @The Impaler 我稍后在查询中使用它,为了简单起见,我把它省略了,我现在编辑了查询。

标签: mysql mysql-8.0


【解决方案1】:

在 MySQL 8.x 中为我工作。例如:

create table t (a int, b int);

insert into t (a, b) values (5, 3);

select a * b into @total from t;

select @total;

结果:

@total
------
    15

但是,如果您的查询产生多于一行,则查询会崩溃。例如:

create table t (a int, b int);

insert into t (a, b) values (5, 3);
insert into t (a, b) values (7, 2);

select a * b into @total from t;
Error: Result consisted of more than one row
SQLState:  42000
ErrorCode: 1172

这很有意义,因为变量只能保存一个值。

【讨论】:

  • Imapaler 我明白你在说什么。我现在拥有的查询获取每一行的值,然后我可以稍后使用它,甚至在下一行进行比较。有没有办法在 MTSQL 8.x 中重现它?
  • 不推荐使用使用变量来产生所需结果的整个策略。我建议您提出一个新问题来解释您想要的结果,我们可以帮助您使用更新、更好的技术从头开始编写一个全新的查询。
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多