首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计带有3个复合主键的表?

如何设计带有3个复合主键的表?
EN

Stack Overflow用户
提问于 2019-05-08 07:02:57
回答 3查看 123关注 0票数 2

我有一张表格,列有表格、评价者、日期和级别。

表单不可能有相同的评估师,表单永远不会有相同的层次。

我试着做主键(表单,鉴定者)和主键(表单,级别),但是它说表单有多个主键。

如果我把主键(表单,评价器,级别),人们只需插入相同的表单和鉴定两次,但只是一个不同的级别,这违反了我的规则。

代码语言:javascript
复制
       |Form|Appraiser|Level|
         1       A       1
         1       B       2
         1       C       3
         2       A       1
         2       B       2
         2       C       3
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-08 09:40:14

我相信你可以:-

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS mytable (form INTEGER, appraiser TEXT, level INTEGER, UNIQUE(form,appraiser), UNIQUE(form,level));

例如,使用以下方法

代码语言:javascript
复制
DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (form INTEGER, appraiser TEXT, level INTEGER, UNIQUE(form,appraiser), UNIQUE(form,level));
INSERT INTO mytable VALUES
                (1,'A',1),(1,'B',2),(1,'C',3),
                (2,'A',1),(2,'B',2),(2,'C',3)
;
INSERT OR IGNORE INTO mytable VALUES (1,'A',4);
INSERT OR IGNORE INTO mytable values (1,'Z',1);

结果如下:

代码语言:javascript
复制
INSERT INTO mytable VALUES
                (1,'A',1),(1,'B',2),(1,'C',3),
                (2,'A',1),(2,'B',2),(2,'C',3)
> Affected rows: 6
> Time: 0.083s
  • 全加

代码语言:javascript
复制
INSERT OR IGNORE INTO mytable VALUES (1,'A',4)
> Affected rows: 0
> Time: 0s
  • 没有添加,因为A已经评估了表格1。

而且还

代码语言:javascript
复制
INSERT OR IGNORE INTO mytable values (1,'Z',1)
> Affected rows: 0
> Time: 0s
  • 未加1级已被评定为1级
票数 1
EN

Stack Overflow用户

发布于 2019-05-08 07:08:11

我们可以在这里尝试使用两个连接表:

代码语言:javascript
复制
CREATE TABLE form_appraiser (
    form_id INTEGER NOT NULL,
    appraiser_id INTEGER NOT NULL,
    PRIMARY KEY (form_id, appraiser_id)
);

CREATE TABLE form_level (
    form_id INTEGER NOT NULL,
    level_id INTEGER NOT NULL,
    PRIMARY KEY (form_id, level_id)
);

这两个表格中的每一个都将确保给定的表格只能与单个评估人员或级别相关联。

然后,维护包含每个唯一表单的一个记录的第三个表forms。如果您有这样的附加要求,即给定的表单只能有一个评估师或级别,那么在一个/两个连接表上对表单添加一个唯一的约束。

票数 1
EN

Stack Overflow用户

发布于 2019-05-08 07:15:57

您可以尝试将唯一约束添加为列标识符。

喜欢

鉴定人VARCHAR(50)唯一,形式VARCHAR(50)唯一,级别VARCHAR(50)唯一,

在这种情况下,不重复这些值。如果要组合不重复的值,则可以使用唯一(窗体、级别)--这意味着不能重复同一级别的窗体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56035212

复制
相关文章

相似问题

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