mysql - 使用什么语法来更新 mysql 中的 SET 列?

标签 mysql enums set

我创建了一个名为 oilcompany 的列,其中包含 SET 数据(Hunt、Pioneer、Chevron、BP)

我可以将其中任何一个输入到石油公司列中,然后从一个石油公司更改为另一个石油公司,但我不知道如何从一个石油公司更改为多个石油公司(例如 Hunt 和 BP)...有什么建议吗?

最佳答案

MySQL documentation没有 UPDATE 语句的示例,但我通常使用两种方法来更新此类列:

  • 使用文本值
  • 使用数值

创建测试环境

mysql> CREATE TABLE tmp_table(
    ->     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ->     oilcompany SET('Hunt', 'Pioneer', 'Chevron', 'BP')
    -> );
Query OK, 0 rows affected (0.54 sec)

mysql> INSERT INTO tmp_table(oilcompany) VALUES ('Hunt'), ('Pioneer');
Query OK, 2 rows affected (0.11 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp_table;
+----+------------+
| id | oilcompany |
+----+------------+
|  1 | Hunt       |
|  2 | Pioneer    |
+----+------------+
2 rows in set (0.00 sec)

替代方案#1:使用文本值

由于 SET 是 ENUM 元素的集合,并且任何 ENUM 元素都可以被视为字符串,那么我们可以执行以下操作:

mysql> UPDATE tmp_table
    -> SET    oilcompany = 'Hunt,BP'
    -> WHERE  id = 1;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM tmp_table;
+----+------------+
| id | oilcompany |
+----+------------+
|  1 | Hunt,BP    |
|  2 | Pioneer    |
+----+------------+
2 rows in set (0.00 sec)

替代方案#2:使用数值

任何 SET 元素在内部存储为 64 位数字,其中包含表示每个 SET 元素的位组合。 在我们的表中:'Hunt'=1、'Pioneer'=2、'Chevron'=4、'BP'=8

此外,mysql 允许使用这些数字而不是文本值。如果我们需要在选择中查看数值,我们需要在数值表达式中使用 SET 列(例如添加零)。 让我们看看当前的值:

mysql> SELECT id, oilcompany+0, oilcompany FROM tmp_table;
+----+--------------+------------+
| id | oilcompany+0 | oilcompany |
+----+--------------+------------+
|  1 |            9 | Hunt,BP    |
|  2 |            2 | Pioneer    |
+----+--------------+------------+
2 rows in set (0.00 sec)

此处 9 = 'Hunt' (1) + 'BP' (8)2 = 'Pioneer' (2)

现在,让我们将 Pioneer 更改为 'Hunt' (1) + 'Chevron' (4):

mysql> UPDATE tmp_table
    -> SET    oilcompany = 5
    -> WHERE  id = 2;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT id, oilcompany+0, oilcompany FROM tmp_table;
+----+--------------+--------------+
| id | oilcompany+0 | oilcompany   |
+----+--------------+--------------+
|  1 |            9 | Hunt,BP      |
|  2 |            5 | Hunt,Chevron |
+----+--------------+--------------+
2 rows in set (0.00 sec)

关于mysql - 使用什么语法来更新 mysql 中的 SET 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49967588/

相关文章:

mysql - 专家意见查询是否可以

mysql - sql查询如何使用IF和ELSE语句

cocoa - 如何在 CoreData 中存储 typedef 枚举

java - 在 Scala 中从 java.util.Set 构造一个 java.util.List

MySQL 查询 : SUM counting duplicate rows

多行的MySQL AVG TimeDiff

java - 枚举实现接口(interface)被 validator 拒绝 (java.lang.VerifyError)

Objective-C:typedef NS_ENUM 错误

Javascript ES6 将对象数组映射到 Set 或按不同属性过滤掉

python - 使用 Python 在更大的列表中查找兼容列表