复合主键显示为null

时间:2015-12-28 17:41:13

标签: sql oracle oracle11g oracle-sqldeveloper

我正在实现一个由3个其他值组成的复合主键。我创建了表,并在所有其他字段中插入数据。我是否正确地假设我不需要为复合pk提供值,因为它使用其他值来创建自己?这是我的CREATE和INSERT脚本来帮助...

CREATE TABLE representation
(
   representation_id   NUMBER (4),
   reference_id        NUMBER (4),
   case_id             NUMBER (4),
   barrister_id        NUMBER (2),
   CONSTRAINT representation_case_id_fk FOREIGN KEY
      (case_id)
       REFERENCES CASE (case_id),
   CONSTRAINT representation_barrister_id_fk FOREIGN KEY
      (barrister_id)
       REFERENCES barrister (barrister_id),
   CONSTRAINT representation_pk PRIMARY KEY
      (reference_id, case_id, barrister_id)
);

INSERT INTO representation (reference_id, case_id, barrister_id)
     VALUES (sq_representation_reference.NEXTVAL, '0', '5');

2 个答案:

答案 0 :(得分:0)

此处没有指示Oracle为 representation_id 提供值。虽然该字段的名称非常具有暗示作为唯一标识符,但实际上没有任何内容可以实现,也没有给它一个值。

您必须自己插入一个值。您可以通过多种方式完成此操作,例如:

  • 为它定义一个默认值(但每次都会给它相同的值)或
  • INSERT声明中包含名称和值,或
  • 写一个ON INSERT触发器,您可以通过基于其他三个的公式定义该字段的值,或者从序列中获取该字段。

答案 1 :(得分:0)

您的复合主键包含三列:

CONSTRAINT representation_pk PRIMARY KEY
  (reference_id, case_id, barrister_id)

您的插入语句成功,因为这些是您填充的三列:

INSERT INTO representation (reference_id, case_id, barrister_id)

REFERENCE_ID没有任何反应,因为它是一个可选列:

SQL> desc representation
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 REPRESENTATION_ID                                  NUMBER(4)
 REFERENCE_ID                              NOT NULL NUMBER(4)
 CASE_ID                                   NOT NULL NUMBER(4)
 BARRISTER_ID                              NOT NULL NUMBER(2)

SQL>

(即使您没有明确指定NOT NULL约束,Oracle也会强制使用主列。)