如何使用ESQL/C显示PostgreSQL中已设置的表约束?
ESQL/C输出PostgreSQL自定义CHECK约束实现方案
实现逻辑
你要查询的check_name_of_det约束存储在PostgreSQL的系统表中,可以通过查询系统表获取约束定义后输出,也可以直接打印固定约束内容,两种实现方式如下:
- 动态查询获取约束并输出:
使用PostgreSQL内置函数pg_get_constraintdef查询系统表直接获取格式化后的约束定义,ESQL/C代码示例:
// 声明宿主变量 EXEC SQL BEGIN DECLARE SECTION; char con_def[1024]; char db_user[32] = "你的数据库用户名"; char db_pwd[32] = "你的数据库密码"; char db_name[32] = "你的数据库名"; EXEC SQL END DECLARE SECTION; // 连接数据库 EXEC SQL CONNECT TO :db_name USER :db_user USING :db_pwd; if (SQLCODE != 0) { printf("数据库连接失败\n"); return -1; } // 查询目标约束定义 EXEC SQL SELECT pg_get_constraintdef(c.oid) INTO :con_def FROM pg_constraint c JOIN pg_class t ON c.conrelid = t.oid WHERE t.relname = 'p' AND c.conname = 'check_name_of_det'; // 输出完整约束语句 printf("ALTER TABLE p\nADD CONSTRAINT check_name_of_det\nCHECK %s;\n", con_def); EXEC SQL DISCONNECT ALL;
- 直接打印固定约束内容:
如果你只需要输出你指定的固定约束,直接打印对应字符串即可:
printf("ALTER TABLE p\nADD CONSTRAINT check_name_of_det \nCHECK ((name = 'Screw' AND n_det = 'P6') OR n_det <>'P6');\n");
约束逻辑中文说明
该约束的作用是:仅当name字段取值为Screw时,n_det字段才允许设置为P6;其余所有场景下n_det字段都不能取值为P6。
内容的提问来源于stack exchange,提问作者karver35
相关产品推荐
相关产品推荐

