云数据库 GAUSSDB-SET类型:注意事项

时间:2024-11-13 14:45:37

注意事项

  • SET类型的表字段值必须是SET类型定义的集合的子集。如:
    gaussdb=# CREATE TABLE employee (
      name text,
      site SET('beijing','shanghai','nanjing','wuhan')
    );
  • site字段的值必须是上述集合定义中的子集,可以是空集合,如果提供的值在SET定义中的成员中不存在,会报错。如:
    gaussdb=# INSERT INTO employee values('zhangsan', 'nanjing,beijing');
    INSERT 0 1
    gaussdb=# INSERT INTO employee VALUES ('zhangsan', 'hangzhou');
    ERROR:  invalid input value for set employee_site_set: 'hangzhou'
  • INSERT时无论用户提供的成员值顺序是怎样的,INSERT成功后,查询到的SET类型的值,其成员都是按照定义时的顺序输出的。
    gaussdb=# SELECT * FROM employee;
       name   |      site       
    ----------+-----------------
     zhangsan | beijing,nanjing
    (1 rows)
  • SET类型是以bitmap的方式存储的。SET类型的成员按照定义时的顺序,赋予不同的值。如:SET('beijing','shanghai','nanjing','wuhan') 的类型,对应的值如下:
    表1 SET成员与其对应的数值

    SET成员

    成员值

    二进制值

    'beijing'

    1

    0001

    'shanghai'

    2

    0010

    'nanjing'

    4

    0100

    'wuhan'

    8

    1000

    因此,如果给SET类型的字段赋值为数值时,会转换为对应的子集。如:9对应的二进制值为 1001, 对应的子集是 'beijing,wuhan'。

    gaussdb=# INSERT INTO employee values('lisi', 9);
    INSERT 0 1
    gaussdb=# SELECT * FROM employee;
       name   |      site       
    ----------+-----------------
     zhangsan | beijing,nanjing
     lisi     | beijing,wuhan
    (2 rows)
    gaussdb=# DROP TABLE employee;
support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0352.html