当前位置: 首页 > 知识库问答 >
问题:

准备好的语句-交叉表更新

石喜
2023-03-14

我试图将预准备语句与跨表更新结合使用。我已经准备了一个代表我们更大数据库的示例脚本。这第一部分做我想要的没有准备好的语句,但我希望避免复制/粘贴我的数据的每一列。

SET SESSION group_concat_max_len = 1000000000;
drop table if exists update_test;
create table update_test(
time_index decimal(12,4),
a varchar(20),
b varchar(20),
c varchar(20));
insert into update_test(time_index) values(20150101.0000),(20150101.0015),(20150101.0030);

drop table if exists energy_values;
create table energy_values(
time_stamp decimal(12,4),
site_id varchar(5),
energy int);
insert into energy_values 
values(20150101.0000,'a',100),(20150101.0000,'b',200),(20150101.0000,'c',300),
      (20150101.0015,'a',400),(20150101.0015,'b',500),(20150101.0015,'c',600),
      (20150101.0030,'a',700),(20150101.0030,'b',800),(20150101.0030,'c',900);

drop table if exists update_test_sites;
create table update_Test_sites(
sites varchar(5));
insert into update_test_sites values
('a'),('b'),('c');

update update_test, energy_values, update_test_sites
set    update_test.a=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='a';

update update_test, energy_values, update_test_sites
set    update_test.b=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='b';

update update_test, energy_values, update_test_sites
set    update_test.c=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='c';
select * from update_test;

这就是为什么我尝试了这样的东西作为更新函数的替代品。然而,我经常收到语法错误报告。有人能指出我哪里出错了吗?这将是非常感谢!

SELECT
concat(

'update update_test, energy_values, update_test_sites
set    update_test.',sites,'=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id = ',sites,';
select * from update_test;')

from update_test_sites
where sites = 'a'
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

共有1个答案

楚望
2023-03-14

我从未见过“选择进入”这样工作。根据我的经验,它是这样使用的:

SELECT [field_list] INTO [variable_list] 
FROM [some_table] 
[etc...]

我不认为它可以用来存储结果集,就像你正在尝试的那样。

通过在存储过程中进行一些调整和执行,您可以使用光标在结果上迭代,以分别准备和执行每个生成的语句。

 类似资料:
  • 我有一个将列名映射到值的。要更新的列事先未知,在运行时决定。 例如< code>map = {col1: "value1 ",col2: "value2"}。 我想执行一个< code>UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,有没有一种优雅的方法可以不用手动构建查询?

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 问题内容: 我刚刚开始做我的第一个项目(很有趣)。我正在学习PHP和MySQL,并且已经完成了我的第一个正常工作的应用程序。它可以工作,但是我现在正在学习如何保护应用程序的安全,从而防止SQL注入。我大约有50多个PHP文件来管理与MySQL数据库的交互。它们看起来都是这样的: 这是我在整个应用程序中用于向数据库读写数据的格式。如果我需要将它们更改为准备好的语句,而不是在其中插入任何信息,而只是在

  • 场景:继我之前的问题(在存储过程中使用游标循环行MySQL)之后,我尝试执行一个嵌套的prepare语句,在该语句中,我向外部语句输入一个日期,然后调用内部语句,该语句从表中获取数据。 代码: 问题:这段代码运行时没有错误,但没有给出任何结果。如果我只运行第一个准备好的语句,一个接一个地直接输入变量,就可以了。所以我猜问题在于我的第二句话。 问题:你知道我做错了什么吗? Obs:第二个代码应该循环