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

时间:2019-05-08 07:02:57

标签: sql sqlite

我有一个表格,其中包含表格,评估师,日期和级别

表单永远不能具有相同的评估者,表单永远不能具有相同的级别。

我试图制作主键(窗体,评估器)和主键(窗体,级别),但是它表示该窗体具有多个主键

如果我放置主键(表单,评估者,级别),人们只能两次插入相同的表单和评估者,但级别不同,这违反了我的规则。

       |Form|Appraiser|Level|
         1       A       1
         1       B       2
         1       C       3
         2       A       1
         2       B       2
         2       C       3

3 个答案:

答案 0 :(得分:2)

我相信您可以使用:-

CREATE TABLE IF NOT EXISTS mytable (form INTEGER, appraiser TEXT, level INTEGER, UNIQUE(form,appraiser), UNIQUE(form,level));

例如使用以下

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

结果是:-

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
  • 全部添加

但是

INSERT OR IGNORE INTO mytable VALUES (1,'A',4)
> Affected rows: 0
> Time: 0s
  • 未添加,因为A已经评估了表格1。

还有

INSERT OR IGNORE INTO mytable values (1,'Z',1)
> Affected rows: 0
> Time: 0s
  • 由于第1级未添加,已被评估为第1级

答案 1 :(得分:1)

我们可以在这里尝试使用两个联结表:

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,其中包含每种唯一形式的一条记录。如果您还有其他要求,即给定的表单只能有一个评估者或级别,则可以在一个或两个联结表上为表单添加唯一约束。

答案 2 :(得分:0)

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

喜欢

评估器VARCHAR(50)唯一, 形式为VARCHAR(50)UNIQUE, 级别VARCHAR(50)UNIQUE,

在这种情况下,不会重复任何值。如果您不想重复使用多个值,则可以使用  唯一(窗体,级别) 这意味着您不能具有相同级别的重复形式。