在mysql中使用什么语法来更新集合列?

wlwcrazw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(350)

我创建了一个名为oilcompany的专栏,它已经设置了数据(hunt、pioneer、chevron、bp)
我可以在oilcompany栏中输入其中任何一个,并从一个公司更改为另一个公司,但我不知道如何从一个oilcompany更改为多个oilcompany(例如hunt和bp)。。。有什么建议吗?

5kgi1eie

5kgi1eie1#

在mysql文档中没有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:使用文本值
由于集合是枚举元素的集合,任何枚举元素都可以被视为字符串,因此我们可以执行以下操作:

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:使用数值
任何集合元素在内部存储为64位数字,其中包含表示每个集合元素的位的组合。在我们的表格中: 'Hunt'=1, 'Pioneer'=2, 'Chevron'=4, 'BP'=8 .
另外,mysql允许使用这些数字而不是文本值。如果我们需要在select中看到数值,我们需要在数值表达式中使用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)
kupeojn6

kupeojn62#

如文档中所述 The ENUM Type :
枚举是一个字符串对象,其值从表创建时列规范中显式枚举的允许值列表中选择。
列一次只能保存一个值。
为了存储多个值,可以使用单独的表:

-- Table A
id
1

-- Table B
post_id data
1       Hunt
1       Pioneer

-- Insert sample data
INSERT INTO A VALUES(1)
INSERT INTO B VALUES(1, 'Hunt'),(1, 'Pioneer')

-- Get all data for id 1
SELECT B.data FROM A
INNER JOIN B ON B.post_id = A.id

相关问题