2013-01-09 25 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,但編碼開銷不斷增加,所以我想你的里程將取決於你將如何以及經常使用這個常量。