9

我在我的数据库中做一些数学运算,我想声明在我的所有程序中都知道的 const 值。(例如 PI)

MySql中有这样的东西吗?

4

3 回答 3

6

这里是数学中的 som函数

你可以定义这样的常量

 SET @myVar = 3;

在这里编辑一个例子

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

这里有一些例子

于 2013-01-09T13:21:59.850 回答
3

老问题,但是当我现在自己研究这个问题时,这是我的两分钱:

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

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

这显然每次都会返回 0。

我敢肯定,与仅在代码中添加 0 相比,它的效率会非常低,但它仍然会在非常小的几分之一秒内运行(每次)。

请注意,如果输入如下查询:update myTable set myVariable = kMyConstant();性能方面有两种可能的结果:

  • 通过将 DETERMINISTIC 放入定义中,因为参数不会每行更改,它只会被评估一次。
  • MySQL 优化器不是那么聪明。

除了性能问题之外,至少您可以将 kMyConstant() 分散在整个代码中,并且知道它始终是相同的值,如果您希望更改返回的值,只需更改函数即可。

PS。如果它确实证明过于频繁地重新评估它,那么你总是可以开始你的程序set @kMyConstant = kMyConstant();然后使用@kMyConstant,但编码开销正在增加,所以我猜你的里程将取决于你使用常量的方式和频率。

于 2015-02-19T17:39:53.973 回答
2

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

如果您有一些常量并且不想为每个常量创建一个函数,这将特别有意义。作为奖励,您可以通过使用一些前端方便地编辑常量值(如果它们用于某些配置目的,不一定如果您想更改 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
于 2015-07-17T16:28:04.493 回答