是否可以创建一个具有一定间隔的枚举类型?

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 ...
);