Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 选择枚举时,将字符串分配给另一列_Php_Mysql - Fatal编程技术网

Php 选择枚举时,将字符串分配给另一列

Php 选择枚举时,将字符串分配给另一列,php,mysql,Php,Mysql,我正在为我的web应用程序创建用户权限功能 假设我有一个表,它有两列(例如,不实用): rank属于ENUM类型,值为“来宾”、“用户”、“管理员” 和另一列权限 是否可以使用纯SQL以某种方式创建此表。这样,当我更新rank列时,它将为permissions列分配预定义的值。但是,我还希望能够在不影响排名列的情况下更改权限。我们可以在更新之前执行触发器 当规范说“updatetherank列”时,我们的意思是表中的一行(或多行)受到update语句的影响。我们并不是要改变表来改变秩列的定义 D

我正在为我的web应用程序创建用户权限功能

假设我有一个表,它有两列(例如,不实用):

rank
属于
ENUM
类型,值为
“来宾”、“用户”、“管理员”

和另一列
权限


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

我们可以在更新之前执行
触发器

当规范说“updatetherank列”时,我们的意思是表中的一行(或多行)受到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 ;
分隔符$$
创建触发器'trg\u mytable\u bu`
更新“mytable”之前`
每行
开始
如果是NEW.rank OLD.rank那么
--不更改列的列值
开始结束
其他的
如果NEW.permission为NULL,则
--默认值仅在权限值为空时应用
如果NEW.rank='guest',则
SET NEW.permissions='fee';
ELSEIF NEW.rank='user'然后
SET NEW.permissions='fi';
ELSEIF NEW.rank='user'然后
设置新权限='fo';
其他的
--意外的秩值
SET NEW.permissions='fum';
如果结束;
如果结束;
如果结束;
结束$$
定界符;
如果希望INSERT具有类似的“默认”赋值行为,则需要在INSERT
触发器之前定义一个单独的
,该触发器可以类似,但不会引用OLD.rank


回答被问到的问题:是的,这是可能的


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

您可以在插入后写入表的|更新触发器;但你的设计听起来已经有缺陷了

  • 您的权限字段听起来像是您计划让它保存一个列表;行中的字段应仅包含一个值
  • 您对ENUM的使用听起来也相当麻烦,它实际上应该只用于从未或几乎从未改变的事物的集合。(如2000年以前的性别问题)。每当出现新列组时,您必须更改/重建表
相反:

  • 权限表:保存权限
  • 等级表:保持等级
  • 等级权限:关联等级和权限
  • 用户:容纳用户
  • 用户等级:关联等级和用户
通过以下方式获取用户权限:加入用户到用户的等级,将权限排列到权限。

是的,您将使用。然而,这听起来似乎是解决问题的错误方法

使用复数“权限”来描述属性意味着它不是原子的,因此不应存储为单个属性。此外,如果可以通过编程方式从
rank
派生权限,则应将其表示为数据。考虑:

create table permissions (
 Rank enumeration ('guest', 'user', 'admin') 
   not null default 'guest',
 Permission varchar(25)
 Primary key (rank, permission)
);
...
Select u.name, u.rank, u.password,
  u.email, group_concat(P.permission) AS permissions
FROM user u
JOIN permissions p
ON u.rank=p.rank
WHERE u.username='bob'
GROUP BY u.name, u.rank, u.password,
  u.email
您还可以使用此解析对象的权限:

Select u.name, u.rank, u.password,
  u.email, group_concat(P.permission) AS permissions
FROM user u
JOIN permissions p
ON u.rank=p.rank
JOIN object_permissions op
ON p.permission=op.permission
JOIN object o
ON op.object_id=o.object_id
WHERE u.username='bob'
AND o.name='user admin' 
GROUP BY u.name, u.rank, u.password,
  u.email

在读入存储过程后(由于我不熟悉SQL),存储过程是否算作“纯SQL”。我不会说它会算数,更具体地说,我需要一些东西在
创建表的阶段执行这个操作。太好了,去写一个好吧,我在问如何做到这一点。。。选择一个
rank
枚举数后。我如何让表自动更新/为
权限
列分配值?