2013-03-13 1200 views
2

在我的數據庫設計中,我傾向於存儲一些用作ROLE或TYPE的變量,如SMALLINT。例如:mysql自定義全局定義變量

CREATE TABLE `house` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` smallint(11) NOT NULL, 

而在PHP中,我做

define('HOUSE_SMALL_TYPE', '0'); 
define('HOUSE_MEDIUM_TYPE', '1'); 

所以在PHP中,在SELECT查詢我做的:

$this->db->query("SELECT * FROM house 
        WHERE type=?;", HOUSE_SMALL_TYPE); 

我的問題是:

  1. 在PHP部分,是否有更好的方法來做到這一點?
  2. 在mysql本身,mysql是否也具有全局定義功能(如在PHP中定義)?

我也想在MySQL查詢做種

SELECT * FROM house WHERE type = HOUSE_SMALL_TYPE 


我的目的是,當我在mysql中進行SELECT時,我沒有辦法將值0,1,2映射到它的真實含義。只需簡單地查看錶值,而不必更改結構表和字段。

+2

我想你尋找[* ENUM *](http://dev.mysql.com/doc/refman/5.0/en/enum.html)。 – Rikesh 2013-03-13 09:33:36

+1

定義「更好的方式」的標準。你想要改進什麼? – 2013-03-13 09:38:31

+0

@Rikesh是否意味着我必須使用ENUM更改我的數據庫類型?我的表格有些被創建,但我會考慮下一個創建表格。 – 2013-03-13 09:46:43

回答

-2

我建議使用MySQL變量:

SET HOUSE_SMALL_TYPE = 0; 
SET HOUSE_MEDIUM_TYPE = 1; 

然後,在你的查詢,你可以使用這些變量:

SELECT * FROM house WHERE type = @HOUSE_SMALL_TYPE; 

這種方法定義會議變量:

如果您更改會話系統變量,該值仍然有效 ,直到您的會話結束或您將變量更改爲 不同的值。其他客戶無法看到該更改。

如果要定義全局變量的MySQL(適用於所有會話):

SET GLOBAL HOUSE_SMALL_TYPE = 0; 
SET GLOBAL HOUSE_MEDIUM_TYPE = 1; 

明確表示,一個變量是一個全局變量,受到全球或先 它的名字@@全局..需要SUPER權限 設置全局變量。

文檔:
SET statement
Using system variables
User-defined variables

+0

AHa ..這正是我想要的。在HOUSE_SMALL_TYPE前面,我加了@來使它工作。 – 2013-03-13 13:29:33

+4

MySQL不允許全局用戶變量,只允許全局用戶變量。從[MySQL SET語句參考:](https://dev.mysql.com/doc/refman/5.7/en/set-statement.html)「[GLOBAL | SESSION] system_var_name = expr」。在上面的回答中,SET GLOBAL HOUSE_SMALL_TYPE = 0;在MySQL 5.5上出現「UNKNOWN SYSTEM VARIABLE'HOUSE_SMALL_TYPE'」消息失敗。 – Hari 2014-04-03 09:40:17

+1

「Hari的」評論應該被解讀爲:「MySQL不允許全局用戶變量,只有用戶變量」 – lepe 2017-03-27 06:28:23

2

從MySQL 5.5是不是可以設置一個全球性的用戶定義的變量。

解決方法可能是創建一個存儲過程,該存儲過程將返回所需的內容。

DROP PROCEDURE IF EXISTS HOUSE_SMALL_TYPE; 
DELIMITER // 
CREATE PROCEDURE HOUSE_SMALL_TYPE() 
BEGIN 
SELECT 0; 
END// 
DELIMITER ; 

,然後調用它。

CALL HOUSE_SMALL_TYPE(); 

DROP聲明是必需的,才能夠修改它。

2

恕我直言,MySQL在這個領域存在巨大差距,顯然在後面的版本。一種選擇可能是訴諸設置操作系統環境變量,但是如何從MySQL內部檢索這些值,我一直無法看到。

這裏有一整個頁面:https://dev.mysql.com/doc/refman/5.0/en/setting-environment-variables.html教會我們如何在shell中「設置」OS環境變量,而不是在MySQL中實際調用這些變量。

作爲另一種解決方法,使用函數可能會被認爲比存儲過程更輕巧,像這樣:

CREATE DEFINER=`root`@`localhost` FUNCTION `DEFAULT_COUNTRY_CODE`() RETURNS CHAR(4) 
DETERMINISTIC 
RETURN '+234'; 

在別處在您的查詢,然後你可以這樣做:

SELECT CONCAT(DEFAULT_COUNTRY_CODE(), "-", telephone) FROM contacts WHERE CountryCode = "NGA" 
+0

似乎MySQL沒有辦法訪問環境變量。正如他們所說的'環境變量可以在命令提示符下設置以影響當前命令處理器的調用...'就是這樣。 – lepe 2017-03-27 06:19:54