我使用以下查询:
select id from foo order by id DESC limit 1
返回上一次id
使用的。
我的应用程序中有一些要加的东西,如果不是零的话,还要加一。工作正常。但是我决定在sql中而不是C#代码中执行此操作。但是当我这样做时:
SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1
但是我遇到一个System.InvalidCastException
错误,令我惊讶的是,下面的代码中打印的数据类型是int64。但是改变了吗?
这是c#代码:
public int GetLastID()
{
using (MySqlConnection con = Open())
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1";
cmd.Connection = con;
con.Open();
MySqlDataReader data = cmd.ExecuteReader();
if (!data.Read())
return 0;
System.Windows.Forms.MessageBox.Show(data["id"].GetType().ToString()); // output: int64
return (int)data["id"];
}
}
}
不要怪我的MySQL不好。我用的不多。如果您知道更好的方法,请告诉我!
分配给列(AS id
)的别名不会更改数据类型。
表达式的数据类型是表达式的结果。
在MySQL中,整数加法运算(例如id + 1
,其中id是整数类型)导致BIGINT
。
这种行为在(现成的)MySQL参考手册中有记录,网址为:https : //dev.mysql.com/doc/refman/5.6/en/arithmetic-functions.html
摘抄:
- 可以使用通常的算术运算符。根据以下规则确定结果:
在,,和的情况下
-
,如果两个操作数均为整数,则将以(64位)精度计算结果。+
*
BIGINT
因此,返回BIGINT
数据类型(64位整数)是预期的行为。
如果您的要求是返回32位整数,则唯一的解决方法(我知道)是创建用户定义的函数,例如
DELIMITER $$
CREATE FUNCTION udf_bigint_to_int(n BIGINT)
RETURNS INTEGER
BEGIN
RETURN n;
END$$
DELIMITER ;
为了证明这是可行的,并且作为有关行为的警告,我们传入的值大于32位整数可以支持的值,我们可以运行以下命令:
SELECT udf_bigint_to_int(9876543210+9)
返回32位整数的最大值:
udf_bigint_to_int(9876543210+9)
-------------------------------
2147483647
如果id
要从表中获取最大值,然后将其加1,然后将其作为32位整数返回,则在创建用户定义的函数后,可以使用如下查询:
SELECT udf_bigint_to_int( MAX(id) + ABS(SIGN( MAX(id) ))) AS id FROM foo
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句