首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合主键查询

复合主键查询
EN

Stack Overflow用户
提问于 2011-11-19 17:28:30
回答 2查看 79关注 0票数 0

当使用复合主键时,插入的值可以相同吗?我给你们举个例子:

表的创建:

代码语言:javascript
复制
Create table test
(
testno number(5) not null,
testpaper varchar(2) not null,
time date
CONSTRAINT Pa_Pks PRIMARY KEY (testno, testpaper) 
)

然后是我想要插入的值:

代码语言:javascript
复制
Testno          Testpaper         Time
12345           22                14-JUL-2011
12345           23                15-JUL-2011
12345           22                16-JUL-2011

如您所见,我的主键在插入过程中具有相同的值。我想这样做的原因是相同的测试号和试卷可以在不同的日期发生。

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

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

代码语言:javascript
复制
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) 
)

感谢您的任何澄清。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-19 17:31:01

不,你不能这样做,主键必须是唯一的。但是,您可以做的是将Test Time添加为键的一部分。或者您可以使用另一个列名作为Id,这将是一个Auto Increment键。所以你的主键是ID (Auto Increment)。

在oracle中,如果您想要一个AutoIncrement密钥,那么您还必须编写序列和触发器。一个序列就是一系列的数字。触发器的目的是每当插入新行时递增编号,并将其存储在列id中。,并且您可能还想增加数字的大小。数字(1)对于主键来说可能不够大。(如果您希望Oracle有一个自动递增Id)或者Simple,您可以向主键添加时间。

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

票数 2
EN

Stack Overflow用户

发布于 2011-11-21 18:27:54

如果time可以为空,那么它不能构成PRIMARY KEY的一部分,但它可以是e UNIQUE约束的一部分。请注意,键就是键,将键指定为“主”是任意的,并且不是强制的。

Testid添加为代理键只有在您开始时有一个自然键时才会起作用。因此:

这两个密钥都是自然密钥:

代码语言:javascript
复制
Create table TEST
(
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);

或者是自然键加上代理键:

代码语言:javascript
复制
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) 
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8193115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档