主键查询和设置(postgres )

今天库里需要建一张新表,需要三个字段联合作为主键。在Navicat里是可以通过点击最后一栏设置主键的。
这里写图片描述
但是我心想,一张表只有一个主键,这个1,2,3表示的是啥啊?心里有点担心的自己的主键有没有设置成功,就查了一下本张表的主键是什么。
下面这个sql语句可以显示主键的名字:

SELECT
    pg_constraint.conname AS pk_name
FROM
    pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
WHERE
    pg_class.relname = 'YOUR_TABLE_NAME'
AND pg_constraint.contype = 'p'

结果是这样的
这里写图片描述
显示了这个主键的名字。
我心说这有啥用啊,我想知道的是这个主键包含的字段。于是就有了下面的这个:

SELECT
    pg_constraint.conname AS pk_name,
    pg_attribute.attname AS colname,
    pg_type.typname AS typename
FROM
    pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid
AND pg_attribute.attnum = pg_constraint.conkey [ 1 ]
INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid
WHERE
    pg_class.relname = 'YOUR_TABLE_NAME'
AND pg_constraint.contype = 'p'

就得到了一个键值
这里写图片描述
通过设置sql语句里的数字为1,2,3就得到了我的这三个键确实是设置为了主键。
然后我就写了以他三为键值的测试,发现确实没错。
我竟然花了一个小时去验证这个Navicat的添加键值是不是正确?
只好稍微梳理一下这几张表

这里写图片描述

pg_constraint 该系统表存储PostgreSQL中表对象的检查约束、主键、唯一约束和外键约束。
pg_attribute该系统表存储所有表(包括系统表,如pg_class)的字段信息。数据库中的每个表的每个字段在pg_attribute表中都有一行记录。
pg_type该系统表存储有关数据类型的信息。
pg_class该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据
pg_constraint.conname  (约束名字)
pg_constraint.conrelid  (该约束所在的表,如果不是表约束则为0)
pg_constraint.conkey (如果是表约束,则是约束控制的字段列表)
pg_constraint.contypec  ( 检查约束, f = 外键约束, p = 主键约束, u = 唯一约束)
pg_constraint.conkey  (如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表)
pg_attribute.attname (字段名)
pg_attribute.attrelid   (此字段所属的表)
pg_attribute.atttypid   (字段的数据类型)
pg_attribute.attnum (字段数目。普通字段是从 1 开始计数的。系统字段 (比如oid)有(任意)负数)
pg_type.typname (数据类型名字)
pg_type.oid (行标识符(隐藏属性;必须明确选择))
pg_class.relname (数据类型名字)
pg_class.oid (行标识符(隐藏属性; 必须明确选择))

到这里应该是比较明确了。
参考资料PostgreSQL 9.4.4 中文手册

猜你喜欢

转载自blog.csdn.net/u013992365/article/details/76547803