2011-11-19 59 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) 
);