对复合pk的查询

时间:2011-11-19 09:28:30

标签: 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                14-JUL-2011
12345           23                15-JUL-2011
12345           22                16-JUL-2011

正如您所看到的,我的主键在插入过程中具有相同的值。我想这样做的原因是同样的testno和测试纸可能会在不同的日期发生。

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

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

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

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:2)

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

在oracle中,如果你想拥有一个AutoIncrement Key,那么你也必须编写序列和触发器。序列只是一系列数字。触发器的目的是在插入新行时增加数字,并将其存储在列id中。 ,你也可能想增加数字的大小。数字(1)可能不足以满足主键的要求。(如果您希望Oracle具有自动增量ID)或简单,您可以将时间添加到主键。

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

答案 1 :(得分:0)

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

添加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) 
);