【问题标题】:Composite Primary Key is displaying as null复合主键显示为空
【发布时间】:2015-12-28 17:41:13
【问题描述】:

我正在实现一个由 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');

【问题讨论】:

  • 有什么问题?您是否期望 representation_id 得到一个值?
  • 是的,您必须将值填充到主键字段中。祝你好运。
  • @trincot 我并没有“期待”它......我不确定结果会是什么,我不确定它是否会被填充。我认为我需要自己填充它 - 这是有道理的。只是想确定一下。不过谢谢
  • “复合主键显示为空。”没有给出任何证据。要使复合主键为空,您需要证明reference_idcase_id 和/或barrister_id 为空。 Representation_id 未设置为您发布的 DDL 中任何类型的键。

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

这里没有指令供 Oracle 给 representation_id 一个值。尽管该字段的名称作为一个唯一标识符非常具有暗示性,但实际上并没有使它成为唯一标识符,也没有赋予它一个值。

您必须自己插入一个值。您可以通过多种方式做到这一点,例如:

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

【讨论】:

    【解决方案2】:

    您的复合主键包含三列:

    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 也会强制主列。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2016-08-21
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多