Mysql 简明教程
MySQL - SET
The MySQL SET data type
MySQL SET 数据类型用于存储从预定义的值列表中选择的一组值。SET 数据类型的每一列都可以从其值列表中选择零个或多个值。在插入或更新数据时,这些值被指定为以逗号分隔的列表。
需要注意的是,可以在 SET 列中存储的值的列表是在创建表时定义的,并且不允许该列表之外的任何值。
例如,如果我们像这样定义 SET 列 -
test_col SET('one', 'two') NOT NULL
该列的可能值 -
-
An empty string ('')
-
'one'
-
'two'
-
'one,two'
Storage of SET Data Type
一个 MySQL SET 列最多可以包含 64 distinct 个成员,这意味着不允许重复的值。如果存在重复,MySQL 会在启用严格 SQL 模式时生成错误或警告。此外,MySQL 在创建表时会自动移除 SET 值中的尾部空格。
在 MySQL 中,当你在 SET 列中存储一个数字时,该数字二进制表示中设置的位确定了哪些集合成员包含在列值中。为了更好地理解,考虑下面的查询 -
Create table test_table (
ID int auto_increment primary key ,
COL1 set('Goa', 'Assam', 'Delhi', 'Kerala')
);
在上一个查询中,每个集合成员都分配了一个位,具有对应的十进制和二进制值 -
所以,如果将 3 的值分配给列(二进制:0011),则它会选择前两个 SET 成员,从而得到“Goa,Assam”。
Example
首先,让我们使用以下查询创建名为 test_table 的表 -
Create table test_table (
ID int auto_increment primary key ,
COL1 set('Goa', 'Assam', 'Delhi', 'Kerala')
);
以下是所获得的输出 −
Query OK, 0 rows affected (0.02 sec)
在向 SET 列插入值时,列出元素不需要特定的顺序。即使某个特定元素列出多次,在以后检索时,每个元素只会出现一次,遵循表创建期间指定的顺序。
在此处,我们将值插入到集合中 -
INSERT INTO test_table (COL1) VALUES
('Goa,Assam'),
('Assam,Goa'),
('Goa,Assam,Goa'),
('Goa,Assam,Assam'),
('Assam,Goa,Assam');
Verification
使用 SELECT 语句显示“test_table”的所有记录,如下所示 -
SELECT * FROM test_table;
正如我们在下面的输出中看到的,所有“COL1”中的值都会显示为“Goa,Assam” -
Example
在以下查询中,我们使用 MySQL LIKE 操作符搜索表中的 SET 值。它查找“COL1”中包含“GOA”的任意位置(甚至是子字符串)的行 -
SELECT * FROM test_table WHERE COL1 LIKE '%Goa%';
Updating the SET Values
在 MySQL 中,你可以通过替换元素、添加元素或从 SET 数据中移除元素来更新 SET 元素。以下是每种方法的示例 -
Replacing SET Data
在下面的查询中,我们将第 5 行的值替换为数字 11,它对应于 Goa + Assam + Kerala (8 + 2 + 1)。
UPDATE test_table SET COL1 = 11 WHERE Id = 5;
Adding Data to SET
您可以使用 CONCAT() 函数向现有 SET 列中添加元素。在此示例中,我们向第 3 行中的值中添加“Kerala”:
UPDATE test_table SET COL1 = CONCAT(COL1, ",Kerala")
WHERE Id = 3;