我使用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
之间可能出现的其他字符串?我到目前为止尝试过:
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
答案 0 :(得分:2)
更新:
所以看起来你有你真正的桌子和一个可能意外创建的桌子。如果您执行select count(*) from mytable
和select 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;
运行可能有所帮助。