【问题标题】:How do I update the members of a MySQL SET Type?如何更新 MySQL SET 类型的成员?
【发布时间】:2010-03-17 19:22:39
【问题描述】:

我有一个值表,其中一列的类型为SET

如果它当前有成员('a','b','c','d'),我如何将'e'添加到可能的值?

我意识到使用 SET 类型有点奇怪,我不清楚为什么要使用它而不是另一个具有该集合值的表的外键,但我没有设计有问题的数据库,而且不能改变那么多。

感谢您的帮助!

更新:如果有帮助,我想更新 所有 行的 SET 类型,而不仅仅是一个。

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    您想将“e”添加到该设置字段中的允许值,或者它已经存在并且您想将“e”添加到该表中设置字段的当前值?

    如果它不是一个允许的值,那么你将不得不做一个 ALTER TABLE 并重新定义该字段:

     ALTER TABLE set_test CHANGE myset myset SET('a','b','c','d','e');
    

    (是的,'myset' 被放在那里两次,这是一个“当前名称新名称”之类的东西。)

    否则,只需执行 UPDATE TABLE 并将字段与 'e' 连接起来,如上一个答案所述。

    【讨论】:

      【解决方案2】:

      要将元素添加到现有 SET,请使用 CONCAT() 函数将新元素添加到逗号分隔列表中。要处理十进制值,我们可以使用按位 OR 运算符 |。

        UPDATE set_test SET myset = CONCAT(myset,",Travel")
            WHERE rowid = 3;
      

        UPDATE set_test SET myset = myset | 1 WHERE rowid = 3;
      

      您还可以使用 CONCAT_WS() 函数,它为我们处理列表分隔符:

        UPDATE set_test SET myset = CONCAT_WS(',',myset,'Dancing')
            WHERE rowid = 6;
      

      【讨论】:

      • 但这是针对一行的,删除 WHERE 子句是否会将“Travel”添加到新行的可能性列表中?
      • 是的,这是针对单行的。在没有 where 子句的情况下尝试一下,看看会发生什么。我的猜测是将它添加到所有行。我会使用不带 where 子句的 concat() 方法。
      • 如果 'set' 值为 NULL,则第一个和第二个示例不起作用。第一个示例在空值上有警告结果(可能不适用于某些配置)。所以我更喜欢更新的最后一个例子
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多