在 PostgreSQL 数据库中,character(n) 通常是这三个中最慢的,因为额外存储成本,故而应选择 text 或 varchar,
栗子:
创建一个表 character_tests
postgres=# CREATE TABLE character_tests (
postgres(# id serial PRIMARY KEY,
postgres(# x CHAR (1),
postgres(# y VARCHAR (10),
postgres(# z TEXT
postgres(# );
CREATE TABLE
postgres=# INSERT INTO character_tests (x, y, z)
postgres-# VALUES
postgres-# (
postgres(# 'Y',
postgres(# 'This is a test for varchar',
postgres(# 'This is a very long text for the PostgreSQL text column'
postgres(# );
错误: 对于可变字符类型来说,值太长了(10)
postgres=# INSERT INTO character_tests (x, y, z)
postgres-# VALUES
postgres-# (
postgres(# 'Y',
postgres(# 'varchar(n)',
postgres(# 'This is a very long text for the PostgreSQL text column'
postgres(# );
INSERT 01
查询 character_tests 表中的数据:
postgres=# SELECT * FROM character_tests
postgres-# ;id| x | y | z
----+---+------------+---------------------------------------------------------
1| Y | varchar(n)| This is a very long text for the PostgreSQL text column(1 行记录)
5. 日期/时间类型
AD 表示公元后,2021AD 表示公元 2021 年; BC 表示公元前,230BC 表示公元前 230 年。 1 毫秒/ 14 位。这个就不太理解,时间戳一共 41 位,所以,可能是 1 毫秒可以走 14 位;
postgres=# SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
name
-------
Carol
(1 行记录)
15.4 修改数组
postgres=# UPDATE sal_emp SET pay_by_quarter = '{19999, 39999, 39999, 39999}' WHERE name = 'Carol';
也可以使用 ARRAY 构造器语法:
postgres=# UPDATE sal_emp SET pay_by_quarter = ARRAY[19999, 39999, 39999, 39999] WHERE name = 'Carol';
15.5 数组中检索
要搜索一个数组中的数值,必须检查该数组的每一个值。
postgres=# SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 20000 OR
postgres-# pay_by_quarter[2] = 20000 OR
postgres-# pay_by_quarter[3] = 20000 OR
postgres-# pay_by_quarter[4] = 20000;
name | pay_by_quarter | schedule
-------+---------------------------+------------------------------------------
Carol |{20000,25000,25000,25000}|{{breakfast,consulting},{meeting,lunch}}(1 行记录)
也可以用下面的语句找出数组中所有元素值都等于 1000 的行:
postgres=# SELECT * FROM sal_emp WHERE 1000 = ALL (pay_by_quarter);
name | pay_by_quarter | schedule
------+---------------------------+------------------------------------------
Bill |{10000,10000,10000,10000}|{{breakfast,consulting},{meeting,lunch}}(1 行记录)
16. 复合类型
复合类型表示一行或者一条记录的结构;
它实际上只是一个字段名和它们的数据类型的列表。
PostgreSQL 允许像简单数据类型那样使用复合类型。
比如,一个表的某个字段可以声明为一个复合类型。
16.1 声明复合类型
postgres=# CREATE TYPE inventory_item AS (
postgres(# name text,
postgres(# supplier_id integer,
postgres(# price numeric
postgres(# );
CREATE TYPE