SQL - 将用户定义的变量添加到 table (mysql)?
SQL - Adding user defined variables to table (mysql)?
所以我有这个代码,它是存储过程的一部分:
SET @MID = 0;
SET @MX = 0;
SET @MY = 0;
SET @MT = 0;
SET @CSTAMP = '2014-6-06 08:03:19';
SELECT @MID=m.ID, @MX=m.x , @MY=m.y , @MT=m.timestamp FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (SELECT MAX(T.timestamp)
FROM (SELECT mm.timestamp FROM movement mm WHERE mm.ID = cSID AND mm.timestamp <= @CSTAMP)AS T);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(ctstamp,@MID,@MX,@MY,@MT);
基本上,它会创建一些用户定义的变量,在查询中为它们赋值,并尝试将它们插入到名为 DBTable
的 table 中,列为 ctimestamp
、ID
、x
、y
、mtimestamp
。问题是,当我在查询后看到 DBTable
时,ID
、x
、y
和 mtimestamp
列都是空的(只有 0) ,并且只有 ctimestamp
填充了游标变量 ctstamp
的值。
我不知道这里出了什么问题...我插入 table 是不是错了?我不能这样插入像@variable_name
这样的变量吗?
任何帮助将不胜感激,谢谢!!
编辑
我只是有一个想法,因为用户定义的变量是特定于会话的,这是否意味着我不能退出我的客户端并关闭计算机而让数据库服务器 运行 剩下的查询?对不起,如果这看起来像一个愚蠢的问题,但我对存储过程很陌生 & SQL。
最好在存储过程中使用普通变量。会话变量没有数据类型,如果您碰巧调用使用相同会话变量的其他过程,会话变量可能会在过程执行期间发生变化。
DECLARE v_mid int;
DECLARE v_mx int;
DECLARE v_my int;
DECLARE v_mt int;
DECLARE v_time datetime;
SELECT m.ID, m.x, m.y, m.timestamp INTO v_mid, v_mx, v_my, v_mt, v_time
FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (
SELECT MAX(mm.timestamp)
FROM movement mm
WHERE mm.ID = cSID AND mm.timestamp <= v_time
);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(v_time,v_mid,v_mx,v_my,v_mt);
在 SELECT 语句中,对用户定义变量的赋值使用(类似 pascal 的)赋值运算符 (:=
) 而不仅仅是等号签名。
例如,这会将值 'foo'
赋值给用户定义的变量:
SELECT @var := 'foo'
^
这与此有很大不同:
SELECT @var = 'foo'
^
这不执行赋值;它被评估为布尔表达式,相等比较的结果 returns returns 0、1 或 NULL。
跟进
不需要所有那些用户定义的变量。您可以更有效地完成相同的结果(使用更少的 SQL 语句)
假设 cSID
是一个过程变量,您只需使用以下命令即可获得等效结果:
SET @CSTAMP = '2014-6-06 08:03:19';
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
SELECT t.ctimestamp, m.ID, m.x, m.y, m.timestamp AS mtimestamp
FROM movement m
JOIN ( SELECT @CSTAMP + INTERVAL 0 DAY AS ctimestamp
, MAX(mm.timestamp) AS max_mm_timestamp
FROM movement mm
WHERE mm.ID = cSID
AND mm.timestamp <= @CSTAMP + INTERVAL 0 DAY
) t
ON m.ID = cSID
AND m.timestamp = t.max_mm_timestamp
ORDER BY 3,4
LIMIT 1
(用户定义的变量@CSTAMP 可以替换为过程变量。
DECLARE v_cstamp DATETIME DEFAULT '2014-06-06 08:03:19';
然后将对 @CSTAMP
的引用替换为对过程变量的引用... v_cstamp
.
所以我有这个代码,它是存储过程的一部分:
SET @MID = 0;
SET @MX = 0;
SET @MY = 0;
SET @MT = 0;
SET @CSTAMP = '2014-6-06 08:03:19';
SELECT @MID=m.ID, @MX=m.x , @MY=m.y , @MT=m.timestamp FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (SELECT MAX(T.timestamp)
FROM (SELECT mm.timestamp FROM movement mm WHERE mm.ID = cSID AND mm.timestamp <= @CSTAMP)AS T);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(ctstamp,@MID,@MX,@MY,@MT);
基本上,它会创建一些用户定义的变量,在查询中为它们赋值,并尝试将它们插入到名为 DBTable
的 table 中,列为 ctimestamp
、ID
、x
、y
、mtimestamp
。问题是,当我在查询后看到 DBTable
时,ID
、x
、y
和 mtimestamp
列都是空的(只有 0) ,并且只有 ctimestamp
填充了游标变量 ctstamp
的值。
我不知道这里出了什么问题...我插入 table 是不是错了?我不能这样插入像@variable_name
这样的变量吗?
任何帮助将不胜感激,谢谢!!
编辑
我只是有一个想法,因为用户定义的变量是特定于会话的,这是否意味着我不能退出我的客户端并关闭计算机而让数据库服务器 运行 剩下的查询?对不起,如果这看起来像一个愚蠢的问题,但我对存储过程很陌生 & SQL。
最好在存储过程中使用普通变量。会话变量没有数据类型,如果您碰巧调用使用相同会话变量的其他过程,会话变量可能会在过程执行期间发生变化。
DECLARE v_mid int;
DECLARE v_mx int;
DECLARE v_my int;
DECLARE v_mt int;
DECLARE v_time datetime;
SELECT m.ID, m.x, m.y, m.timestamp INTO v_mid, v_mx, v_my, v_mt, v_time
FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (
SELECT MAX(mm.timestamp)
FROM movement mm
WHERE mm.ID = cSID AND mm.timestamp <= v_time
);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(v_time,v_mid,v_mx,v_my,v_mt);
在 SELECT 语句中,对用户定义变量的赋值使用(类似 pascal 的)赋值运算符 (:=
) 而不仅仅是等号签名。
例如,这会将值 'foo'
赋值给用户定义的变量:
SELECT @var := 'foo'
^
这与此有很大不同:
SELECT @var = 'foo'
^
这不执行赋值;它被评估为布尔表达式,相等比较的结果 returns returns 0、1 或 NULL。
跟进
不需要所有那些用户定义的变量。您可以更有效地完成相同的结果(使用更少的 SQL 语句)
假设 cSID
是一个过程变量,您只需使用以下命令即可获得等效结果:
SET @CSTAMP = '2014-6-06 08:03:19';
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
SELECT t.ctimestamp, m.ID, m.x, m.y, m.timestamp AS mtimestamp
FROM movement m
JOIN ( SELECT @CSTAMP + INTERVAL 0 DAY AS ctimestamp
, MAX(mm.timestamp) AS max_mm_timestamp
FROM movement mm
WHERE mm.ID = cSID
AND mm.timestamp <= @CSTAMP + INTERVAL 0 DAY
) t
ON m.ID = cSID
AND m.timestamp = t.max_mm_timestamp
ORDER BY 3,4
LIMIT 1
(用户定义的变量@CSTAMP 可以替换为过程变量。
DECLARE v_cstamp DATETIME DEFAULT '2014-06-06 08:03:19';
然后将对 @CSTAMP
的引用替换为对过程变量的引用... v_cstamp
.