如何避免Postgres中的标识符截断

时间:2015-08-07 11:47:30

标签: postgresql

我想删除与表关联的所有外键。

我首先使用下面的

识别与之关联的外键
  SELECT DISTINCT constraint_name
  FROM information_schema.key_column_usage
  WHERE table_name = 'crm_campaign_offer_customer_groups'
  AND   table_schema = 'schema001'
  AND   constraint_name LIKE '%fkey%'

然后使用类似

的语句循环遍历其中的每个外键
ALTER TABLE crm_campaign_offer_customer_groups DROP CONSTRAINT crm_campaign_offer_customer_groups_variable_1_fkey1;

正在发生的问题是它首先截断外键表达式然后尝试删除截断的表达式

NOTICE: identifier "..." will be truncated to "..."
ERROR: constraint "..." of relation "..." does not exist

似乎是截断标识符> 63个字符,但我希望有一个替代方案,因为已经设置了表和变量命名约定

1 个答案:

答案 0 :(得分:0)

对于那些到此结束的人,请密切检查您的密钥名称。 Postgres也会在创建时预先截断生成的名称,因此您需要在DROP上匹配此截断以正确引用它。

ALTER TABLE really_long_table_more_than_63_chars ADD PRIMARY KEY (fields);

- >

ALTER TABLE really_long_table_more_than_63_chars DROP CONSTRAINT 
really_long_table_more_than_63_c_pkey;

在创建约束或索引而未指定名称时,Postgres行为似乎是:

将姓名生成为{table_name} + _pkey{table_name} + _check

如果以上name.length是> 63个字符,截断{table_name}足够短,使得组合字符串为63.即{table_name}[:58] + _pkey{table_name}[:57] + _check