如何生成约束sql?

cda*_*ndr 0 postgresql constraint scripting

我正在寻找一种可以生成创建 SQL 的方法,例如SQL选择约束时的 PgAdmin 选项卡。(pg admin 是怎么做的?)

我想实现一个通用方法,可以在处理后删除并重新创建外键约束。

Sah*_*sci 5

Postgresql 有pg_get_constraintdef函数,用于生成特定约束的创建语句。

这是一个例子;

架构 (PostgreSQL v13)

create table test (
  id integer primary key,
  data integer check (data between 1 and 100)
);


create table test2 (
  id integer primary key,
  data integer,
  test_id integer references test (id)
);
Run Code Online (Sandbox Code Playgroud)

查询#1

select
    connamespace::regnamespace "Schema",
    conrelid::regclass "Table",
    conname "Constraint",
    pg_get_constraintdef(oid) "Definition",
    format ('ALTER TABLE %I.%I ADD CONSTRAINT %I %s;', 
                connamespace::regnamespace,
                conrelid::regclass,
                conname,
                pg_get_constraintdef(oid)
           )
    
  from pg_constraint 
  where 
    conname IN (
        'test_data_check', 'test_pkey', 
        'test2_pkey', 'test2_test_id_fkey' 
    );
Run Code Online (Sandbox Code Playgroud)
模式 桌子 约束 定义 格式
民众 测试 测试数据检查 检查 (((数据 >= 1) AND (数据 <= 100))) 更改表 public.test 添加约束 test_data_check CHECK (((data >= 1) AND (data <= 100)));
民众 测试 测试密钥 主键(id) 更改表 public.test 添加约束 test_pkey 主键(id);
民众 测试2 test2_pkey 主键(id) 更改表 public.test2 添加约束 test2_pkey 主键(id);
民众 测试2 test2_test_id_fkey 外键(test_id)参考测试(id) 更改表 public.test2 添加约束 test2_test_id_fkey 外键 (test_id) 引用 test(id);

在 DB Fiddle 上查看