2011-11-19 55 views
0

使用复合pk时,可以插入的值是否相同?我说明了一个例子,你们:查询复合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) 
) 

感谢任何澄清。

回答

2

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

在oracle中,如果你想有一个自动增量键,那么你将不得不写序列和触发器。一个序列只是一系列的数字。触发的目的是在插入新行时增加数字,并将其存储在列标识中。 ,你也可能想增加Number的大小。数字(1)的主键大小可能不够(如果您希望Oracle具有自动增量标识)或简单,您可以将时间添加到主键。

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

+0

我知道。有什么方法可以将它识别为主键,但同时插入相同的值?这就是我想问的, – JLearner

+0

@ user976050:** NO ** - 您的主键**必须是唯一的定义,所以你**不能**具有重复值... –

+0

@ user976050答案编辑与可能的选项 – Zohaib

0

如果time可以为空,则它不能形成PRIMARY KEY的一部分,但它可以是约束的一部分。请注意,一把钥匙是一把钥匙,指定一把钥匙作为“主要钥匙”是任意的,而不是强制性的。

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