Sql 复合主键显示为空
我正在实现一个由3个其他值组成的复合主键。我已经创建了表,并在所有其他字段中插入了数据。假设我不需要为复合pk提供值,因为它使用其他值来创建自己,这对吗?以下是我的创建和插入脚本以帮助Sql 复合主键显示为空,sql,oracle,oracle11g,oracle-sqldeveloper,Sql,Oracle,Oracle11g,Oracle Sqldeveloper,我正在实现一个由3个其他值组成的复合主键。我已经创建了表,并在所有其他字段中插入了数据。假设我不需要为复合pk提供值,因为它使用其他值来创建自己,这对吗?以下是我的创建和插入脚本以帮助 CREATE TABLE representation ( representation_id NUMBER (4), reference_id NUMBER (4), case_id NUMBER (4), barrister_id
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');
这里没有关于Oracle为representation_id指定值的说明。尽管该字段的名称作为唯一标识符非常具有启发性,但实际上并没有任何东西使其成为唯一标识符,也没有赋予其值 您必须自己插入一个值。这可以通过以下几种方式实现:
- 为它定义一个默认值(但每次都会给它相同的值),或者
- 在
语句中包含名称和值,或INSERT
- 在INSERT触发器上编写一个
,在该触发器中,您可以通过基于其他三个的公式来定义此字段的值,或者从序列中获取该值
CONSTRAINT representation_pk PRIMARY KEY
(reference_id, case_id, barrister_id)
insert语句成功,因为这是您填充的三列:
INSERT INTO representation (reference_id, case_id, barrister_id)
引用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>
(即使您没有明确指定NOTNULL约束,Oracle仍强制主列。)问题出在哪里?您希望representation\u id获得值吗?是的,您必须将值填充到主键字段中。祝你好运。@trincot我没有“期待”它会。。。我不确定结果会是什么,我不确定它是否会被填充。我认为我需要自己填充它——这是有道理的。只是想确定一下。尽管“复合主键显示为null”,但还是要感谢您。没有给出这方面的证据。要使复合主键为null,您需要显示
reference\u id
、case\u id
和/或barrister\u id
为null<代码>表示\u id未设置为您发布的DDL中任何类型的键。