我有一个使用enum类型的表列.我希望更新该enum类型以获得额外的可能值.我不想删除任何现有值,只需添加新值.最简单的方法是什么?
我很少看到野外使用的ENUM数据类型; 开发人员几乎总是只使用如下所示的辅助表:
CREATE TABLE officer_ranks (
id int PRIMARY KEY
,title varchar NOT NULL UNIQUE);
INSERT INTO ranks VALUES (1,'2LT'),(2,'1LT'),(3,'CPT'),(4,'MAJ'),(5,'LTC'),(6,'COL'),(7,'BG'),(8,'MG'),(9,'LTG'),(10,'GEN');
CREATE TABLE officers (
solider_name varchar NOT NULL
,rank int NOT NULL REFERENCES officer_ranks(id) ON DELETE RESTRICT
,serial_num varchar PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)
但是也可以使用用户定义的类型/ ENUM显示相同的内容:
CREATE TYPE officer_rank AS ENUM ('2LT', '1LT','CPT','MAJ','LTC','COL','BG','MG','LTG','GEN');
CREATE TABLE officers (
solider_name varchar NOT NULL
,rank officer_rank NOT NULL
,serial_num varchar PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)
(使用PostgreSQL显示的示例,但其他RDBMS具有类似的语法)
我看到使用ENUM的最大缺点是从应用程序内部更新更加困难.它也可能会使曾经习惯使用SQL DB的缺乏经验的开发人员感到困惑.
假设信息大多是静态的(工作日名称,月份名称,美国军队等级),使用ENUM是否有任何优势?
我想保存一系列枚举.
我有以下内容:
CREATE TABLE public.campaign
(
id integer NOT NULL,
product product[]
)
Run Code Online (Sandbox Code Playgroud)
产品是一个enum.
在Django我定义它是这样的:
PRODUCT = (
('car', 'car'),
('truck', 'truck')
)
class Campaign(models.Model):
product = ArrayField(models.CharField(null=True, choices=PRODUCT))
Run Code Online (Sandbox Code Playgroud)
但是,当我写下以下内容时:
campaign = Campaign(id=5, product=["car", "truck"])
campaign.save()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ProgrammingError: column "product" is of type product[] but expression is of type text[]
LINE 1: ..."product" = ARRAY['car...
Run Code Online (Sandbox Code Playgroud)
注意 我看到了这个答案,但我不使用sqlalchemy,如果不需要,我宁愿不使用它.
编辑 我在下面尝试了@Roman Konoval建议:
class PRODUCT(Enum):
CAR = 'car'
TRUCK = 'truck'
class Campaign(models.Model):
product = ArrayField(EnumField(PRODUCT, max_length=10))
Run Code Online (Sandbox Code Playgroud)
与:
campaign …Run Code Online (Sandbox Code Playgroud) 我注意到像 Postgres 这样的一些数据库添加了,Enum但问题是,
integer/string based enum会成为性能问题?下面这个回答关于Postgresql enum的差异有哪些优点和缺点?
因为当您使用 Rails 或在本例中使用EctoElixir 语言时,存在一定程度的抽象,因此列出的两个优点之一根本不会成为问题,因此只需要performance关注。
因此,当该优势确实很重要时,您就放弃了其中列出的劣势