是否可以将ID列定义为唯一但每个值必须出现两次?
例如:
表格翻译:
id | name_id | translation
____________|_________|____________
1 | 1 | apple
____________|_________|____________
2 | 1 | apfel
____________|_________|____________
3 | 2 | pear
____________|_________|____________
4 | 2 | birne
我希望name_id值始终出现两次,而不是一次而不是三次。 name_id是表格中的FK,我的对象需要翻译。
答案 0 :(得分:2)
你的意思是最多两次?或者你的意思是他们必须发生两次(即,一次只是不好) 如果是前一个,只有一个是好的)那么你可以添加一个位字段并在实际的id和位字段上制作主键复合。
如果后者(他们发生两次),则将两个id字段放在同一行中,然后将每个字段设为一个字段唯一键。
答案 1 :(得分: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