2013-01-09 22 views
4

我做我的数据库里面的一些数学运算,我想声明的是将我的所有过程被称为常量的值。(像PI例如)MySql的常量值

有没有这样的事情在MySQL?

+1

仅供参考,['PI()'](http://dev.mysql.com/doc/refman/5。0/en // mathematical-functions.html#function_pi)将返回PI。 – h2ooooooo

+1

@ h2ooooooo,这只是一个例子,我希望声明自己的constants –

回答

1

如果发现满足下面的解决方案。它基于编译器优化,如果表达式的结果只能返回一行,则使用常量替换表,请参阅MySQL Manual。例如,在指定唯一非空列的值时就是这种情况。

如果你有一些常量,并且不想为每个函数创建一个函数,这就特别有意义。作为奖励,您可以通过使用某个前端方便地编辑常量值(如果它们用于某些配置目的,而不一定需要更改pi),而不是重新定义函数。转移数据库可能也更容易,因为转储表比转储功能更容易。

CREATE TABLE `constant` (
    `id` varchar(45) NOT NULL, 
    `double_value` DOUBLE DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

INSERT INTO constant VALUE ('pi', 3.1415); 

SELECT constant.double_value/4 FROM constant WHERE constant.id = 'pi'; 
-- is translated into SELECT 3.1415/4 

SELECT table1.field1/constant.double_value 
    FROM table1, constant 
    WHERE constant.id = 'pi'; 
-- is translated into SELECT table1.field1/3.1415 FROM table1 
2

这里SOM functions in mathematik

和u可以定义这样的

SET @myVar = 3; 

编辑这里的这个

set @var1 := 0; 
    set @var2 := @var1 := 5; 
    select @var1, @var2; 
    +--------+--------+ 
    | @var1 | @var2 | 
    +--------+--------+ 
    | 5  | 5  | 
    +--------+--------+ 

为例常数这里SOM examples

+1

但是我能否在我的所有程序中使用我的var? –

+0

用一些例子编辑。 –

+0

我遇到了这个话题,寻找同一个问题的答案。我的搜索还发现“如何定义可用于多个过程的常量?”在https://forums.mysql.com/read.php?98,273432,274722#msg-274722和“带有常量的存储过程”,位于https://forums.mysql.com/read.php?98655459 ,655471#MSG-655471。虽然不太理想,但我计划将我的实现变量作为局部变量,名称用大写字母表示,这在C和C++中是常见的做法。 –

2

老阙但由于我现在正在研究这个问题,我自己在这里是我的两分钱:

据我所知,没有用户可定义常量这样的事情。但是你可以创建一个函数并让它返回你想要的值:

CREATE FUNCTION `kMyConstant`() 
    NO SQL 
    DETERMINISTIC 
RETURNS TINYINT UNSIGNED 
BEGIN 
RETURN 0; 
END 

这显然每次都会返回0。我相当肯定,相比于在代码中加入0,它会非常低效,但它仍然会在非常小的一秒(每次)中运行。

被警告说,如果放像的查询:update myTable set myVariable = kMyConstant();有两种可能的结果的性能代价:

  • 通过将确定性的定义,参数不每行改变它只会评估一次。
  • MySQL优化器不是那么聪明。

抛开性能问题,至少你可以在整个代码中分散kMyConstant(),并知道它始终是相同的值,并且如果你想改变返回的值,只需更改函数即可。

PS。如果它确实经常重新评估它,那么你总是可以开始你的程序set @kMyConstant = kMyConstant();,然后使用@kMyConstant,但编码开销不断增加,所以我想你的里程将取决于你将如何以及经常使用这个常量。