Уникальное ограничение комбинации двух столбцов

Я создал таблицу t1t2, которая соединяет таблицы t1 и t2 следующим образом:

CREATE TABLE t1t2(
id integer primary key,
t1_id integer,
t2_id integer,
foreign key(t1_id) references t1(id),
foreign key(t2_id) references t2(id));

Можно ли определить ограничение (ограничение), разрешающее только уникальные значения кортежа (t1_id, t2_id)? Или я должен проверить это в приложении?


person xralf    schedule 08.05.2012    source источник


Ответы (3)


 CREATE UNIQUE INDEX idx_twocols ON t1t2(t1_id, t2_id)

Вероятно, вам потребуется добавить NOT NULL в объявления для каждого из двух столбцов.

В качестве альтернативы вы можете отказаться от столбца первичного ключа (если все, что вы используете, это уникальность) и создать первичный ключ в комбинации t1_id и t2_id:

CREATE TABLE t1t2(
t1_id integer NOT NULL,
t2_id integer NOT NULL,
PRIMARY KEY (t1_id, t2_id),
foreign key(t1_id) references t1(id),
foreign key(t2_id) references t2(id));

ПЕРВИЧНЫЙ КЛЮЧ — это частный случай УНИКАЛЬНОГО индекса. Использование составного PRIMARY KEY экономит вам один столбец и один индекс, но требует, чтобы ваше приложение знало как t1_id, так и t2_id для извлечения одной строки из таблицы.

person Larry Lustig    schedule 08.05.2012
comment
Это не только для уникальности (мне нужна колонка t1t2.id), но меня интересует альтернативный метод. Не могли бы вы показать таблицу? Я подожду некоторое время, прежде чем принять, чтобы быть уверенным, что это правильно, спасибо. - person xralf; 08.05.2012

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

UNIQUE(t1_id, t2_id),
person Banjocat    schedule 26.03.2015

Вы можете создать свой первичный индекс UNIQUE с этими параметрами, чтобы сохранить первичный ключ и уникальное ограничение SQL Lite New Index вариант

person Sky Games Inc    schedule 05.07.2016
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person mathielo; 05.07.2016