首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用索引而不是单词引用集合成员时,无法使用REPLACE更新表中的MySQL集合数据类型

问在使用索引而不是单词引用集合成员时,无法使用REPLACE更新表中的MySQL集合数据类型
EN

Stack Overflow用户
提问于 2021-10-30 21:29:00
回答 1查看 25关注 0票数 0

我有下面的表格my_set_table -

代码语言:javascript
复制
my_set_table | CREATE TABLE `my_set_table` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `my_col` set('C','C++','Java','C#','JavaScript','Kotlin','SQLite','Python') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

这里的集合成员索引如下-

代码语言:javascript
复制
+-----------+---------+--------------+
| Binary    | Decimal | Member       |
+-----------+---------+--------------+
| 0000 0001 | 1       | "C"          |
| 0000 0010 | 2       | "C++"        |
| 0000 0100 | 4       | "Java"       |
| 0000 1000 | 8       | "C#"         |
| 0001 0000 | 16      | "Javascript" |
| 0010 0000 | 32      | "Kotlin"     |
| 0100 0000 | 64      | "SQLite"     |
| 1000 0000 | 128     | "Python"     |
+-----------+---------+--------------+

我按如下方式填写该表-

代码语言:javascript
复制
INSERT INTO my_set_table (my_col) VALUES
    -> (9),
    -> (36),
    -> (100),
    -> (130),
    -> (128),
    -> (136);

现在,表的内容是-

代码语言:javascript
复制
SELECT * FROM my_set_table;
+----+--------------------+
| id | my_col             |
+----+--------------------+
|  1 | C,C#               |
|  2 | Java,Kotlin        |
|  3 | Java,Kotlin,SQLite |
|  4 | C++,Python         |
|  5 | Python             |
|  6 | C#,Python          |
+----+--------------------+

现在,我可以使用索引而不是单词来搜索特定的行,如下所示:

代码语言:javascript
复制
SELECT * FROM my_set_table  
    -> WHERE my_col = 9;
+----+--------+
| id | my_col |
+----+--------+
|  1 | C,C#   |
+----+--------+

现在,如果我想要更新我的表,我可以使用下面的单词来完成-

代码语言:javascript
复制
UPDATE my_set_table 
    -> SET my_col = REPLACE(my_col,"C#","Java")
    -> WHERE ID = 1;
SELECT * FROM my_set_table;
+----+--------------------+
| id | my_col             |
+----+--------------------+
|  1 | C,Java             |
|  2 | Java,Kotlin        |
|  3 | Java,Kotlin,SQLite |
|  4 | C++,Python         |
|  5 | Python             |
|  6 | C#,Python          |
+----+--------------------+

但是,我打算使用索引而不是单词。因此,我用索引替换了上面查询中的单词。但我无法得到想要的结果-

代码语言:javascript
复制
UPDATE my_set_table 
    -> SET my_col = REPLACE(my_col,8,4)
    -> WHERE id = 1;
SELECT * FROM my_set_table;
+----+--------------------+
| id | my_col             |
+----+--------------------+
|  1 | C,C#               |
|  2 | Java,Kotlin        |
|  3 | Java,Kotlin,SQLite |
|  4 | C++,Python         |
|  5 | Python             |
|  6 | C#,Python          |
+----+--------------------+

我甚至尝试匹配整个索引值并将其替换为另一个索引值,但仍然不成功。

代码语言:javascript
复制
UPDATE my_set_table
    -> SET my_col = REPLACE(my_col,9,5)
    -> WHERE id = 1;
SELECT * FROM my_set_table;
+----+--------------------+
| id | my_col             |
+----+--------------------+
|  1 | C,C#               |
|  2 | Java,Kotlin        |
|  3 | Java,Kotlin,SQLite |
|  4 | C++,Python         |
|  5 | Python             |
|  6 | C#,Python          |
+----+--------------------+

那么,如何使用索引而不是单词来执行更新操作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 22:08:56

您可以使用按位操作来执行您所描述的操作:

代码语言:javascript
复制
mysql> select my_col from my_set_table where id=1;
+--------+
| my_col |
+--------+
| C,C#   |
+--------+

mysql> update my_set_table set my_col = my_col & ~8 | 4 where id = 1;
Query OK, 1 row affected (0.02 sec)

mysql> select my_col from my_set_table where id=1;
+--------+
| my_col |
+--------+
| C,Java |
+--------+

& ~8对1000 (二进制)的逐位补码1111111111111111111111111111111111111111111111111111111111110111执行逐位AND运算。这将去掉表示C++的位。

| 4对100 (二进制)进行逐位OR运算。这将设置Java的位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69782292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档