mysql自定义全局定义变量

时间:2013-03-13 09:30:33

标签: php mysql database

在我的数据库设计中,我倾向于存储一些作为ROLE或TYPE作为SMALLINT的变量。例如:

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中的define)?
  3. 我也想做点什么

    SELECT * FROM house  WHERE type = HOUSE_SMALL_TYPE
    
    在mysql查询中


    我的目的是当我在mysql中执行SELECT时,我不会继续将值0,1,2与其真正含义进行映射。只需查看表值即可,而无需更改结构表和字段。

4 个答案:

答案 0 :(得分:3)

自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语句才能修改它。

答案 1 :(得分:2)

恕我直言,MySQL在这方面存在巨大差距,显然在后者版本中。一种替代方案可能是设置OS环境变量,但是如何从MySQL中检索这些值,我一直无法看到。

这里有一整页:https://dev.mysql.com/doc/refman/5.0/en/setting-environment-variables.html教我们如何在shell中“设置”OS环境变量,而不是在MySQL中实际调用这些变量。

作为另一种解决方法,使用FUNCTION可能被认为比STORED PROCEDURE更轻量级,如下所示:

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"

答案 2 :(得分:0)

您的方法很好,如果您想查看MySQL中的值而不是1、2、3等,请考虑以下事项:

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

然后在MySQL中可以使用:

SELECT * FROM house  WHERE type = 'HOUSE_SMALL_TYPE';

您只需要记住,如果不喜欢PHP,就不能将任何您喜欢的值塞入house.type。

最好考虑一下:

class HouseType {
  const SMALL = 'SMALL';
  const MEDIUM = 'MEDIUM';
}

class House {
  const TYPE_SMALL = 'SMALL';
  const TYPE_MEDIUM = 'MEDIUM';
}

因为您可以在PHP代码中使用HouseType::SMALLHouse::TYPE_SMALL而不是使用全局定义。这样,您可能会受益于某些IDE的代码完成。

答案 3 :(得分:-2)

我建议使用MySQL变量:

SET HOUSE_SMALL_TYPE = 0;
SET HOUSE_MEDIUM_TYPE = 1;

然后,在您的查询中,您可以使用以下变量:

SELECT * FROM house  WHERE type = @HOUSE_SMALL_TYPE;

此方法定义会话变量:

  

如果更改会话系统变量,则该值仍然有效   直到你的会话结束或直到你将变量更改为a   不同的价值。其他客户无法看到此更改。

如果要定义全局MySQL变量(可用于所有会话):

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

要明确指出变量是全局变量,请在其前面   它的名字由GLOBAL或@@ global .. SUPER特权是必需的   设置全局变量。

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