在我的数据库设计中,我倾向于存储一些作为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);
我的问题是:
我也想做点什么
SELECT * FROM house WHERE type = HOUSE_SMALL_TYPE
在mysql查询中。
我的目的是当我在mysql中执行SELECT时,我不会继续将值0,1,2与其真正含义进行映射。只需查看表值即可,而无需更改结构表和字段。
答案 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)
这里有一整页: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::SMALL
或House::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