删除PostgreSQL中select查询返回的约束

时间:2017-03-20 22:36:27

标签: postgresql

我正在编写一个迁移脚本来删除在不同环境中具有不同名称的约束

放弃此约束:

ALTER TABLE ONLY custom_data
    ADD CONSTRAINT fk_rails_d86d725d64
    FOREIGN KEY (custom_id) REFERENCES customs(id);

我想做这样的事情:(但它不起作用)

alter table custom_data
drop constraint (
    SELECT CONSTRAINT_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME =  'custom_data'
    AND COLUMN_NAME =  'custom_id')

还有另一种方法可以改写以上它可能有用吗?或者有人可以帮助我理解为什么以上不起作用?

更新

也尝试使用do,但它也不起作用。当我检查时,约束仍然存在。

do $$
    declare c_name text;
    begin
        select constraint_name into c_name
        from information_schema.key_column_usage
        where table_name = 'custom_data' and 
            column_name = 'custom_id';

      execute format ('alter table custom_data drop constraint %I', c_name);
    end;
$$;

如果运行select语句,

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME =  'custom_data'
AND COLUMN_NAME =  'custom_id'

有时结果是,

 | constraint_name
_|____________________
1| fk_rails_d86d725d64

但有时结果是,

 | constraint_name
_|____________________
1| 

运行大查询以获取约束并将其删除时,

有时结果是,

Empty query string

但有时结果是,

Name         | Value
_____________|___________
Query        | do
Updated Rows | 0
Finish time  | Tue Mar 21...

现在它开始对我来说似乎是一个糟糕的空白问题......

这也会受到已经拥有索引的列的影响吗?

CREATE INDEX index_custom_data_on_custom_id ON custom_data USING btree (custom_id);

1 个答案:

答案 0 :(得分:0)

<强>解决方案:

变化:

select constraint_name
from information_schema.key_column_usage
where table_name = 'custom_data' and 
      column_name = 'custom_id';

要:

select constraint_name
from information_schema.key_column_usage
where table_name = 'custom_data' and column_name = 'custom_id';

我猜这是一个空白问题。赞赏评论中的所有帮助。