【问题标题】:How do I see the primary key of a table? And how can I add multiple primary keys?如何查看表的主键?以及如何添加多个主键?
【发布时间】:2020-10-24 20:09:41
【问题描述】:

我有下表:https://i.imgur.com/gWyCQxS.png

db name: testdb
table name: testtable

我在创建表时故意没有创建任何主键,因为我想在以后学习如何创建它。

我使用以下方法添加主键:

ALTER TABLE testtable
ADD PRIMARY KEY (column2);

在 pgAdmin 中,我可以看到它有效:https://i.imgur.com/3wKsOLo.png

我尝试对 column1 执行相同操作,但出现此错误:ERROR: multiple primary keys for table "testtable" are not allowed SQL state: 42P16

Q1:为什么我不允许此表有多个主键,如何添加多个主键?

另外,不使用 pgAdmin GUI,我试图查看 testtable 的当前主键是什么。我在 Stackoverflow 上找到了一个推荐以下代码的线程:

select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='testtable'
and type_desc LIKE '%CONSTRAINT'

执行此操作后出现错误:ERROR: relation "sys.objects" does not exist

Q2:如何使用 psql 或不使用 pgAdmin GUI 查看所有主键?

【问题讨论】:

标签: sql postgresql psql pgadmin-4


【解决方案1】:

A1:尝试使用这样的复合 KEY:

ALTER TABLE testtable
ADD PRIMARY KEY (column1,column2);

A2:(Q2:如何使用 psql 查看所有主键?)

类似这样的:

select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
  join information_schema.key_column_usage kc 
    on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
  and kc.ordinal_position is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

【讨论】:

  • 海报桌的A2是什么样子的
  • Marichyasana- EDIT A2:是 Q2 的答案:如何使用 psql 或不使用 pgAdmin GUI 查看所有主键?
  • 我得到以下信息:i.imgur.com/uvF6WhY.png 这似乎向我显示了主键。谢谢!
  • 在重新定义之前,您必须删除任何旧的 PRIMARY KEY。在您的情况下,您必须首先删除 KEY(column2)
  • 我尝试完全按照上面的方式使用该命令,但它导致了语法错误。我认为约束的名称需要在CONSTRAINT之后使用。我使用 \d testtable 的 a_horse_with_no_name 方法找到约束的名称,并使用 ALTER TABLE testtable DROP CONSTRAINT testtable_pkey 删除约束。这有效:i.imgur.com/heBzuhP.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多