4

在我的数据库设计中,我倾向于将一些旨在充当 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 中的定义)?

我也想做点什么

SELECT * FROM house  WHERE type = HOUSE_SMALL_TYPE;

在 MySQL 查询中。

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

4

5 回答 5

4

从 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语句是必需的,以便能够对其进行修改。

于 2015-05-12T11:43:37.377 回答
2

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

这里有一整页:https ://dev.mysql.com/doc/refman/5.0/en/setting-environment-variables.html教我们如何在 shell 中“设置”操作系统环境变量,但只字不提实际上在 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"
于 2015-05-21T12:48:48.820 回答
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::SMALLorHouse::TYPE_SMALL而不是使用全局定义。通过这样做,您可能会受益于某些 IDE 中的代码完成。

于 2019-01-28T22:31:00.870 回答
0

由于 MySQL 5.5 无法设置全局用户定义变量,另一种解决方法可能是帮助表

create table glob_var(key varchar(10) unique not null, val varchar(10) not null);
于 2021-11-16T15:33:36.377 回答
-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;

要明确指出变量是全局变量,请在其名称前加上 GLOBAL 或 @@global.. 设置全局变量需要 SUPER 权限。

文档:
SET 语句
使用系统变量
用户定义的变量

于 2013-03-13T11:39:10.980 回答