0

使用复合 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

如您所见,我的主键在插入期间具有相同的值。我想这样做的原因是相同的 testno 和 testpaper 可以在不同的日期发生。

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

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

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) 
)

感谢您的任何澄清。

4

2 回答 2

2

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

在 oracle 中,如果您想要一个 AutoIncrement Key,那么您还必须编写序列和触发器。序列只是一系列数字。触发器的目的是在插入新行时增加数字,并将其存储在列 id 中。, 你可能还想增加 Number 的大小。Number(1) 对于主键来说可能不够好。(如果你希望 Oracle 有一个自动递增的 Id)或者简单,你可以将 Time 添加到你的主键。

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

于 2011-11-19T09:31:01.083 回答
0

如果time可以为空,则它不能构成 a 的一部分,PRIMARY KEY但它可以是 eUNIQUE约束的一部分。请注意,密钥是密钥,将密钥指定为“主”是任意的,不是强制性的。

Testid仅当您有一个自然键开始时,添加为代理键才有效。所以:

仅自然键:

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

OR 自然键加代理键:

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) 
);
于 2011-11-21T10:27:53.770 回答