Как разработать таблицу с 3 составными первичными ключами - PullRequest
2 голосов
/ 08 мая 2019

У меня есть таблица со столбцами Форма, Оценщик, Дата и Уровень

Форма никогда не может иметь одинаковых оценщиков, и форма никогда не может иметь одинаковые уровни.

Я попытался сделать первичный ключ (Форма, оценщик) и первичный ключ (Форма, уровень), но там написано, что форма имеет несколько первичных ключей

Если я поставлю первичный ключ (форма, оценщик, уровень), люди могут просто вставить одну и ту же форму и оценщик дважды, но только с другим уровнем, что нарушает мои правила.

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

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Полагаю, вы могли бы использовать: -

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 голос
/ 08 мая 2019

Здесь мы можем попробовать использовать две соединительные таблицы:

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, содержащую одну запись для каждой уникальной формы.Если у вас есть дополнительное требование, чтобы у данной формы был только один оценщик или уровень, добавьте уникальное ограничение на форму на одну / обе соединительные таблицы.

0 голосов
/ 08 мая 2019

Вы можете попробовать добавить уникальное ограничение в качестве идентификатора столбца.

как

оценщик VARCHAR (50) UNIQUE, форма VARCHAR (50) UNIQUE, уровень VARCHAR (50) UNIQUE,

В этом случае ни одно из значений не повторяется.Если вы хотите, чтобы комбинация значений не повторялась, вы можете использовать UNIQUE (форма, уровень). Это означает, что вы не можете повторять форму того же уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...