是否可以创建一个具有一定间隔的枚举类型?
Is it possible to create a type that is an enum of some interval?
如何使用 ENUM 创建一个包含区间所有成员的新 TYPE?喜欢:
CREATE TYPE letters [a...z]
有no built-in syntax for this,但你可以用动态的SQL:
DO
$$
BEGIN
EXECUTE
(
SELECT 'CREATE TYPE a2z AS ENUM ('''
|| string_agg(chr(ascii('a') + g), ''',''')
|| ''')'
FROM generate_series(0,25) g
);
END
$$;
这将构建并执行以下形式的语句:
CREATE TYPE a2z AS ENUM ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')
这取决于您的语言环境,但我认为所有语言环境都具有连续范围内的 a-z
,这就是它所需要的。已使用 UTF-8 语言环境进行测试。
任何不易放入 ENUM
的替代品
对于较长的值列表、易于更改或不像示例中那么简单的值或特殊数据类型等,请考虑创建一个小型 查找 table 而是使用 foreign key constraint 。日期选择示例:
CREATE TABLE my_date (my_date date PRIMARY KEY);
INSERT INTO my_date(my_date) VALUES ('2015-02-03'), ...;
CREATE TABLE foo (
foo_id serial PRIMARY KEY
, my_date date REFERENCES my_date ON UPDATE CASCADE
--, more columns ...
);
如何使用 ENUM 创建一个包含区间所有成员的新 TYPE?喜欢:
CREATE TYPE letters [a...z]
有no built-in syntax for this,但你可以用动态的SQL:
DO
$$
BEGIN
EXECUTE
(
SELECT 'CREATE TYPE a2z AS ENUM ('''
|| string_agg(chr(ascii('a') + g), ''',''')
|| ''')'
FROM generate_series(0,25) g
);
END
$$;
这将构建并执行以下形式的语句:
CREATE TYPE a2z AS ENUM ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')
这取决于您的语言环境,但我认为所有语言环境都具有连续范围内的 a-z
,这就是它所需要的。已使用 UTF-8 语言环境进行测试。
任何不易放入 ENUM
的替代品
对于较长的值列表、易于更改或不像示例中那么简单的值或特殊数据类型等,请考虑创建一个小型 查找 table 而是使用 foreign key constraint 。日期选择示例:
CREATE TABLE my_date (my_date date PRIMARY KEY);
INSERT INTO my_date(my_date) VALUES ('2015-02-03'), ...;
CREATE TABLE foo (
foo_id serial PRIMARY KEY
, my_date date REFERENCES my_date ON UPDATE CASCADE
--, more columns ...
);