在PostgreSQL中,如果不存在,则创建类型
Postgres 17不支持这种语法。
CREATE TYPE IF NOT EXISTS TASK_STATUS
AS ENUM ('TO_DO', 'IN_PROGRESS', 'DONE');
IF NOT EXISTS 很重要,因为它是每次应用程序启动时执行的脚本的一部分。
除了 声明一个丑陋的PL/PGSQL块 之外,还有哪些变通方法?(答案发表于7年前,可能已经过时)
解决方案
没有 CREATE TYPE IF NOT EXISTS,我猜也永远不会有。
尽管有大量支持 IF NOT EXISTS 的DDL语句,但项目对新增这类语句仍然存在一定的顾虑。
这一观点在 pgsql-hackers列表中的一封电子邮件 里,由 Tom Lane(关于相关主题 CREATE DATABASE IF NOT EXISTS)很好地表达:
就我所知,我通常对CREATE IF NOT EXISTS语义在各处都持反对态度,因为它的语义过于模糊:它确保同名对象存在,但你对它的属性或内容没有任何保证。对象越复杂,这个问题就越大……而一个数据库是我们所拥有的最复杂的对象。所以,依我看,我们没有这个“特征”其实是件好事。
如果你确定任何名为 task_status 的现有类型是正确的,你可以用这条极其简单的 DO 语句轻松解决这个缺失的特性:
DO 'BEGIN
CREATE TYPE task_status AS ENUM (''TO_DO'', ''IN_PROGRESS'', ''DONE'');
EXCEPTION WHEN duplicate_object THEN
NULL; -- ignore the error
END;';
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。