我创建了一个名为oilcompany的列,其中包含SET数据(Hunt,Pioneer,Chevron,BP)
我可以将任何一个进入oilcompany列并从一个变为另一个但我无法弄清楚如何从一个石油公司改为多个石油公司(例如Hunt和BP)......任何建议?
答案 0 :(得分:0)
如The ENUM Type
的文档中所述:
ENUM是一个字符串对象,其值从列表中选择 在列中显式枚举的允许值 表创建时的规范。
该列一次只能包含一个值。
为了存储多个值,您可以使用单独的表:
-- 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
答案 1 :(得分:0)
在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)