postgresql - Postgres 使用数据字典表生成 sql 输出
问题描述
我所需要的只是得到一个 SQL 查询输出:
ALTER TABLE TABLE_NAME
ADD CONSTRAINT
FOREIGN KEY (COLUMN_NAME)
REFERENCES (PARENT_TABLE_NAME);
我正在使用数据字典表运行以下动态查询,
SELECT DISTINCT
'ALTER TABLE ' || cs.TABLE_NAME ||
'ADD CONSTRAINT' || rc.CONSTRAINT_NAME ||
'FOREIGN KEY' || c.COLUMN_NAME ||
'REFERENCES' || cs.TABLE_NAME ||
' (' || cs.CONSTRAINT_NAME || ') ' ||
' ON UPDATE ' || rc.UPDATE_RULE ||
' ON DELETE ' || rc.DELETE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC,
INFORMATION_SCHEMA.TABLE_CONSTRAINTS CS,
INFORMATION_SCHEMA.COLUMNS C
WHERE cs.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
AND cs.TABLE_NAME = c.TABLE_NAME
AND UPPER(cs.TABLE_SCHEMA) = 'SSP2_PCAT';
但是在这里,即使我能够生成所需的输出,但问题在于它没有给出这里,而是在关键字PARENT_TABLE_NAME
之后给出相同的 table_name 。ALTER TABLE
我希望这很清楚,因为我们在这里使用动态 SQL,并且非常感谢任何帮助!
解决方案
您的查询缺少几个连接表和连接条件。另外,不要忘记可以在多个列上定义外键。最后,您的查询容易受到通过对象名称的 SQL 注入的攻击。
pg_catalog.pg_constraint
但是如果你使用而不是`information_schema' ,它会简单得多:
SELECT format('ALTER TABLE %s ADD CONSTRAINT %I %s',
conrelid::regclass,
conname,
pg_get_constraintdef(oid))
FROM pg_catalog.pg_constraint
WHERE contype = 'f'
AND upper(connamespace::regnamespace::text) = 'SSP2_PCAT';
推荐阅读
- php - 运行数据库迁移时使用特定的数据库连接
- ios - 在一个 pod 下构建为模块的多个子项目
- html - 如何从表格的下拉菜单中删除先前选择的选项?
- python - 使用 render_template() 中的“for”循环在 html 中显示表格
- excel - 最后一整行不复制到其他工作表
- bash - tshark 根据 MAC 地址拆分 pcap 文件
- r - R:每个 ID 只有最近观察的子集数据
- c# - 是否可以在一个接口的字典中访问多个接口?
- javascript - 如何在反应中集中 API 调用的错误处理(使用 Axios)
- python - 如何在 Pygame“全屏”模式下退出已停止的 Python 程序?