php - 选择枚举时将字符串分配给另一列

标签 php mysql

我正在为我的网络应用程序制作用户权限功能,

假设我有一个包含 2 列的表(例如,不实用):

ENUM 类型的

rank 值为 'guest','user','admin'

和另一列权限

是否可以使用纯 SQL 以某种方式创建此表。这样,当我更新 rank 列时,它会为 permissions 列分配预定义的值。但是,我也希望有可能在不影响 rank 列的情况下更改权限。

最佳答案

我们可以实现一个BEFORE UPDATE触发器。

当规范说“更新排名列”时,我们的意思是表中的一行(或多行)受到 UPDATE 语句的影响。我们并不是要更改表格来更改排名列的定义。

DELIMITER $$

CREATE TRIGGER `trg_mytable_bu`
BEFORE UPDATE ON `mytable`
FOR EACH ROW
BEGIN

   IF NEW.rank <=> OLD.rank THEN
      -- no change to rank col value
      BEGIN END
   ELSE
      IF NEW.permission IS NULL THEN
         -- defaults apply only if permission value is NULL
         IF NEW.rank = 'guest' THEN 
            SET NEW.permissions = 'fee';
         ELSEIF NEW.rank = 'user' THEN
            SET NEW.permissions = 'fi'; 
         ELSEIF NEW.rank = 'user' THEN
            SET NEW.permissions = 'fo';
         ELSE
            -- unexpected value of rank
            SET NEW.permissions = 'fum';
         END IF;
      END IF;
   END IF;
END$$

DELIMITER ;

如果我们想要对 INSERT 进行类似的“默认”赋值行为,我们需要定义一个单独的 BEFORE INSERT 触发器,它可以是类似的,但不会有对 OLD.rank 的引用。


回答所提出的问题:是的,这是可能的。

回答一个不同的问题(没有被问到)...“我们的数据库设计是否应该实现这样的触发器?”要回答这个问题,我认为我们应该重新思考这个问题,并考虑一些替代设计。从长远来看,我们可能会更好地使用不使用 ENUM 列的设计,以及不需要根据分配给 ENUM 的值将默认值分配给另一列的设计。

关于php - 选择枚举时将字符串分配给另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281972/

相关文章:

javascript - Google reCAPTCHA v2 忽略 CSS 对齐

javascript - Ajax 数组不会在下拉选择时填充

php - 选择仅具有一个不同列的重复行并将其分组

mysql - 如何自加入以及何时加入

mysql - Sequelize 区分大小写查询——使用 BINARY

php - 使用 JQuery/javascript 下载 POST 请求生成的文件

php - 从 mysql 数据填充下拉列表(如果在单独的数据库中,则从下拉列表中删除)- php/html

java - 用于内连接查询的 Hibernate 映射对象

sql - MySQL:如何选择具有特定值的组?

mysql - 限制左连接