2014-09-22 5 views
1

Возможно ли, чтобы идентификационный столбец был уникальным, но каждое значение должно быть дважды?Двойные значения в таблице

Например:

стол ПЕРЕВОД:

id   | name_id | translation 
____________|_________|____________ 
1   | 1  | apple 
____________|_________|____________ 
2   | 1  | apfel  
____________|_________|____________ 
3   | 2  | pear 
____________|_________|____________ 
4   | 2  | birne 

Я хочу name_id значения всегда происходит в два раза, а не один раз, а не три раза. name_id - это FK из таблицы с моими объектами, которые нужно перевести.

+2

Ну, если это происходит в два раза это по определению не уникально вообще, почему/what is name_id? Возможно, если вы объясните свою потребность, можно предложить альтернативу. (Вы также должны отредактировать и добавить тег для своей конкретной платформы базы данных) –

+0

Если записи не могут произойти один раз, как вы вставляете начальную запись? –

+1

Ограничения проверки кардинальности не могут быть определены декларативными в СУБД. Вам необходимо реализовать такой тип ограничений в уровне целостности данных, как триггеры или логика приложения. –

ответ

2

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

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

2

Нет, это невозможно, чтобы применял, хотя вы можете попробовать его с помощью триггеров, это обычно довольно грязное решение.

Я бы изменить структуру таблицы, чтобы быть что-то вроде следующего:

ID 
NAME_ID 
LANGUAGE_ID 
TRANSLATION 

Затем можно создать уникальный индекс на NAME_IDиLANGUAGE_ID. Теоретически, у вас также будет таблица LANGUAGES, а столбец LANGUAGE_ID будет иметь внешний ключ обратно в LANGUAGES.ID - тогда вы можете ограничить количество раз, которое появляется каждый NAME_ID, не имея данных в LANGUAGES.

В конечном счете это означает, что ваша схема будет выглядеть следующим образом:

create table languages ( 
    id number 
, description varchar2(4000) 
, constraint pk_languages primary key (id) 
    ); 

insert into languages values (1, 'English'); 
insert into languages values (2, 'German'); 

create table names (
    id number 
, description varchar(4000) 
, constraint pk_names primary key (id) 
    ); 

insert into names values (1, 'apple'); 
insert into names values (2, 'pear'); 

create table translations (
    id number 
, name_id number 
, language_id number 
, translation varchar2(4000) 
, constraint pk_translations primary key (id) 
, constraint fk_translations_names foreign key (name_id) references names (id) 
, constraint fk_translations_langs foreign key (language_id) references languages (id) 
, constraint uk_translations unique (name_id, language_id) 
    ); 

insert into translations values (1, 1, 1, 'apple'); 
insert into translations values (2, 1, 2, 'apfel'); 
insert into translations values (3, 2, 1, 'pear'); 
insert into translations values (4, 2, 2, 'birne'); 

и вы должны быть в состоянии разорвать ограничения:

SQL> insert into translations values (5, 1, 3, 'pomme'); 
insert into translations values (5, 1, 3, 'pomme') 
* 
ERROR at line 1: 
ORA-02291: integrity constraint (FK_TRANSLATIONS_LANGS) violated - parent 
key not found 


SQL> insert into translations values (5, 1, 2, 'pomme'); 
insert into translations values (5, 1, 2, 'pomme') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (UK_TRANSLATIONS) violated 

См this SQL Fiddle

+1

Да, у меня есть точное решение (вы можете посмотреть мой другой вопрос), но это не идеально, поэтому я ищу другое решение. –

+0

Почему это не идеальный @PRO_gramista? Он отлично работает, когда я демонстрирую ... – Ben

+1

В моей таблице «имена» имеется более одного столбца для перевода. и больше таблиц, а также возможность просмотра таблиц. мой босс думает, что это можно сделать лучше. –

Смежные вопросы