为什么pg_table_def表返回包含文本" _ $ mig"

时间:2017-01-19 10:02:00

标签: amazon-redshift

我使用pg_table_def来计算与给定表关联的主键,例如:

SELECT pg_table_def.tablename,
       pg_table_def.column
FROM pg_table_def
WHERE schemaname = 'myschema'
AND   tablename LIKE '%mytable%'
AND   tablename LIKE '%_pkey%';

以上查询的示例输出:

tablename          column
mytable_$mig_pkey  id

这是正确识别主键,但在某些情况下,返回的表名格式中包含文本_$mig,例如:mytable_$mig_pkey

我在代码的后面部分使用tablename,因此目前必须删除此文本。我的问题是:

  • 为什么某些表格是使用_$mig格式化的表格名称?
  • 是否应该考虑tablename_pkey之间可能出现的其他字符串?
  • 或者是否有更好的方法来识别与a关联的主键 表?

我到目前为止尝试过:

  • 检查AWS documentation它建议检查search_path,所以我已经完成了这项工作,并确保在where子句中引用了架构。
  • 检查mytable_$mig是否存在/不可用。
  • 其他谷歌搜索还没有让我更进一步......

更新

根据以下评论,运行以下查询:

select tablename, "column", type, encoding, distkey, sortkey, "notnull"
from pg_table_def
where schemaname = 'myschema' AND tablename LIKE '%mytable%';

返回:

tablename         column type                  encoding distkey sortkey notnull
mytable           id     integer               none     true    1       true
mytable           desc   character varying(50) lzo      false   0       false
mytable_$mig_pkey id      integer               none     true    1       false

1 个答案:

答案 0 :(得分:2)

更新:

所以看起来你有你真正的桌子和一个可能意外创建的桌子。如果您执行select count(*) from mytableselect count(*) from mytable_$mig_pkey;,希望mytable包含您的所有数据,另一个数据是。{ 空。如果是这样,您可以使用drop table mytable_$mig_pkey进行清理。

我看到你有id列作为主题密钥的Redshift版本的distkey。您可能还在尝试定义Redshift允许您执行的约束,但它们是not enforced

您可以像这样查看已定义的表约束:

select * from information_schema.table_constraints 
where table_name='mytable';

在我的一张桌子上给出了如下结果:

 constraint_catalog | constraint_schema | constraint_name | table_catalog | table_schema | table_name | constraint_type | is_deferrable | initially_deferred
 --------------------+-------------------+-----------------+---------------+--------------+------------+-----------------+---------------+--------------------
        mydb      | myschema         | mytable_pkey         | mydb | myschema    | mytable         | PRIMARY KEY     | NO            | NO
  (1 row)

我目前的猜测是您试图在表上定义约束并在某个时刻意外创建了第二个表,这就是为什么另一个表名称中有_pkey的原因。

我自己使用这样的查询:

select tablename, "column", type, encoding, distkey, sortkey, "notnull"
from pg_table_def
where schemaname = 'myschema' AND tablename LIKE '%mytable%';

运行更通用的东西可能会帮助你弄清楚发生了什么。

我在注释中引用的\d是一种列出数据库中所有表的方法,这些表是psql命令行应用程序内置的便捷函数。它运行的查询是这样的:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','m','S','f','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

运行可能有所帮助。