表中的双精度值

时间:2014-09-22 12:25:50

标签: sql oracle database-design unique

是否可以将ID列定义为唯一但每个值必须出现两次?

例如:

表格翻译:

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

我希望name_id值始终出现两次,而不是一次而不是三次。 name_id是表格中的FK,我的对象需要翻译。

2 个答案:

答案 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

请参阅this SQL Fiddle