使用复合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)
)
感谢您的任何澄清。
答案 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)
);