Нет, это невозможно, чтобы применял, хотя вы можете попробовать его с помощью триггеров, это обычно довольно грязное решение.
Я бы изменить структуру таблицы, чтобы быть что-то вроде следующего:
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
Ну, если это происходит в два раза это по определению не уникально вообще, почему/what is name_id? Возможно, если вы объясните свою потребность, можно предложить альтернативу. (Вы также должны отредактировать и добавить тег для своей конкретной платформы базы данных) –
Если записи не могут произойти один раз, как вы вставляете начальную запись? –
Ограничения проверки кардинальности не могут быть определены декларативными в СУБД. Вам необходимо реализовать такой тип ограничений в уровне целостности данных, как триггеры или логика приложения. –