我正在我的数据库中进行一些数学运算,我想声明将在我的所有程序中都知道的const值。(例如PI)
MySql中有这样的东西吗?
答案 0 :(得分:3)
老问题,但是我现在正在研究这个问题,这是我的两分钱:
据我所知,没有用户可定义的常数。但是,您可以创建一个函数并让它返回您想要的值:
CREATE FUNCTION `kMyConstant` ()
NO SQL
DETERMINISTIC
RETURNS TINYINT UNSIGNED
BEGIN
RETURN 0;
END
这显然每次都会返回0.
我非常肯定,与在代码中添加0相比,它的效率会非常低,但它仍会在很短的时间内运行(每次)。
请注意,如果放入如下查询:update myTable set myVariable = kMyConstant();
有两种可能的结果表现:
除了性能问题之外,至少你可以在整个代码中分散kMyConstant()并知道它总是会是相同的值,如果你想改变返回的值,你只需更改函数。
PS。如果它确实经常重新评估它,那么你总是可以开始你的程序set @kMyConstant = kMyConstant();
然后使用@kMyConstant
但是编码开销正在增长,所以我猜你的里程将取决于如何和频繁你将使用常数。
答案 1 :(得分:2)
你可以定义这样的常量
SET @myVar = 3;
编辑这是
的一个例子 set @var1 := 0;
set @var2 := @var1 := 5;
select @var1, @var2;
+--------+--------+
| @var1 | @var2 |
+--------+--------+
| 5 | 5 |
+--------+--------+
这里是examples
答案 2 :(得分: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