Oracle:查找主键 - PK和NN

时间:2015-10-14 10:14:45

标签: database oracle primary-key composite-primary-key

我正在使用数据库,并被告知表USERS只有一个主键 - USERID。使用ALL_CONS_COLS给出了以下内容:

OWNER   | TABLE_NAME | CONSTRAINT_NAME | COLUMN_NAME | POSITION
----------------------------------------------------------------
MONSTER |   USERS    |   USER_ID_PK    |   USERREF   |   2
MONSTER |   USERS    |   USER_ID_NN    |   USERID
MONSTER |   USERS    |   USER_ID_PK    |   USERID    |   1

这表明PK是一个由USERREFUSERID组成的复合词。

我不遵循一些事情:

为什么USERID同时具有NOT NULL约束和PK约束?根据定义,PK表示NN。 其次,由于USERIDNN约束,为什么USERREF没有NN约束? 第三,为什么CONSTRAINT_NAME"建议" PKUSER_IDUSERID),即为什么约束以单个列命名;不会USERS_PK成为更好的约束名吗?

那么,最终,它是否为复合PK

1 个答案:

答案 0 :(得分:2)

  

那么,最终,它是否是复合PK?

是。主键在两列上一起定义。该职位将告诉你领先的专栏。 USER_ID_PK主键约束在USERID上定义为前导列,后跟USERREF

  

为什么USERID既有NOT NULL约束又有PK约束?

因为有人明确地在主键列上创建了 NOT NULL 约束。

让我们来测试一下。

单个主键

SQL> create table t(a number primary key);

Table created.

SQL> SELECT a.table_name,
  2    b.column_name,
  3    a.constraint_type,
  4    b.position
  5  FROM user_constraints a
  6  JOIN user_cons_columns b
  7  ON a.owner             = b.owner
  8  AND a.constraint_name  = b.constraint_name
  9  AND a.table_name       = b.table_name
 10  AND a.constraint_type IN ('P', 'C');

TABLE_NAME COLUMN_NAM C   POSITION
---------- ---------- - ----------
T          A          P          1

复合主键

SQL> drop table t purge;

Table dropped.

SQL> create table t(a number, b number);

Table created.

SQL> alter table t add constraint t_pk PRIMARY KEY(a,

Table altered.

SQL> SELECT a.table_name,
  2    b.column_name,
  3    a.constraint_type,
  4    b.position
  5  FROM user_constraints a
  6  JOIN user_cons_columns b
  7  ON a.owner             = b.owner
  8  AND a.constraint_name  = b.constraint_name
  9  AND a.table_name       = b.table_name
 10  AND a.constraint_type IN ('P', 'C');

TABLE_NAME COLUMN_NAM C   POSITION
---------- ---------- - ----------
T          A          P          1
T          B          P          2

主键且非空

SQL> drop table t purge;

Table dropped.

SQL> create table t(a number primary key not null);

Table created.

SQL> SELECT a.table_name,
  2    b.column_name,
  3    a.constraint_type,
  4    b.position
  5  FROM user_constraints a
  6  JOIN user_cons_columns b
  7  ON a.owner             = b.owner
  8  AND a.constraint_name  = b.constraint_name
  9  AND a.table_name       = b.table_name
 10  AND a.constraint_type IN ('P', 'C');

TABLE_NAME COLUMN_NAM C   POSITION
---------- ---------- - ----------
T          A          C
T          A          P          1