Sql 对复合pk的质疑

Sql 对复合pk的质疑,sql,oracle,insert,compound-key,Sql,Oracle,Insert,Compound Key,使用复合pk时,插入值是否相同?我给你们举个例子: 创建表格: Create table test ( testno number(5) not null, testpaper varchar(2) not null, time date CONSTRAINT Pa_Pks PRIMARY KEY (testno, testpaper) ) 这是我想插入的值: Testno Testpaper Time 12345 22

使用复合pk时,插入值是否相同?我给你们举个例子:

创建表格:

Create table test
(
testno number(5) not null,
testpaper varchar(2) not null,
time date
CONSTRAINT Pa_Pks PRIMARY KEY (testno, testpaper) 
)
这是我想插入的值:

Testno          Testpaper         Time
12345           22                14-JUL-2011
12345           23                15-JUL-2011
12345           22                16-JUL-2011
正如您所看到的,我的主键在插入期间具有相同的值。我之所以想这样做,是因为相同的测试编号和测试试卷可以在不同的日期进行

如果我想添加相同的值,但将其标记为主键,该如何做

这应该是标准和正确的方法:

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid) 
)

感谢您的澄清。

不,您不能这样做,主键必须是唯一的。然而,您可以做的是,您可以添加测试时间作为密钥的一部分。或者您可以使用另一个列名作为Id,这将是一个自动递增键。因此,您的主键将是ID(自动递增)

在oracle中,如果您想要一个自动递增键,那么您还必须写入序列和触发器。序列只是一系列数字。触发器的目的是在插入新行时增加数字,并将其存储在列id中,您还可以增加数字的大小。数字(1)的大小可能不足以容纳主键。(如果您希望Oracle具有自动递增Id)或者简单,您可以为主键添加时间


标准取决于您的要求。这两种方法都是遵循的。

如果
时间
可为空,则它不能构成
主键
的一部分,但它可以是e
唯一
约束的一部分。请注意,密钥是密钥,将密钥指定为“主密钥”是任意的,不是强制性的

添加
Testid
作为代理密钥仅在有自然密钥开始时有效。因此:

仅自然关键点:

Create table TEST
(
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);
或自然密钥加上代理密钥:

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid), 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);

我知道。有没有办法将其标识为主键,但同时插入相同的值?这就是我想问的,@user976050:NO-您的主键定义必须是唯一的,所以您不能有重复的值…好的,明白了。甚至我把测试时间作为密钥的一部分。这会有帮助的,对吗?我仍然无法插入任何相同的值。好啊我已经更新了我的表格,这应该是正确和标准的方式。请看一看。@user976050对不起,我记不清上一个表定义了,您到底更新了什么?您可以参考我的标准和正确方法来做。。用于更新的表。