我必须让我的数据库能够翻译一些术语。 这是我的数据库的基本绘图:
第一张表(还有更多喜欢它):
create table objects
id int PRIMARY KEY,
name varchar(50),
name_id int FOREIGN KEY,
第二张表:
create table language
language varchar(20)
language_id PRIMARY KEY
第三张表:
create table translations
language_id FOREIGN KEY,
name_id UNIQUE KEY,
translation varchar(50)
它看起来像这样:
对象:
id | name | name_id
___|______|________
1 |apple |1
语言:
language_id | laguage
____________|________
1 | ENG
____________|________
2 | DEU
文:
language_id | name_id | translation
____________|_________|____________
1 | 1 | apple
____________|_________|____________
2 | 1 | apfel
现在,翻译中的两列,language_id和name_id都必须是唯一的。但只有一个,name_id必须引用表对象中的外键。
有可能吗?如果不是,那么替代方案呢?
答案 0 :(得分:0)
可以在大多数数据库中创建UNIQUE约束:
-- Add unique constrain on two columns
ALTER TABLE TRANSLATIONS
ADD CONSTRAINT unq_translations UNIQUE (language_id, name_id);
-- Add foreign key constrain.
ALTER TABLE TRANSLATIONS
ADD CONSTRAINT fk_translations_name FOREIGN KEY (language_id, name_id) REFERENCES OBJECTS(language_id, id);
答案 1 :(得分:0)
使用以下替代方法...执行按顺序。
1.创建表对象(object_id number(10)主键,object_name varchar(50));
2 .create table language(language_id number(10)primary key,language_name varchar(20));
3.创建表转换(translation_id number(10)主键,translation varchar(50),object_id number(10), language_id number(10),foreign key(object_id)引用object(object_id),外键(language_id)引用语言(language_id));
4. alter table translation添加唯一(object_id,language_id);
答案 2 :(得分:-1)
首先,在TRANSLATIONS表中,“name_id”是UNIQUE,我很惊讶您是如何在此列中插入重复条目的。为第三个表提供正确的数据。
在TRANSLATIONS表中,name_id不应包含重复值。
在TRANSLATIONS表中只有一个可以包含重复条目的列(带约束)是LANGUAGE_ID,并且通过使其唯一而没有任何好处,因为它在其父表LANGUAGE中已经是唯一的。
但是如果在此处使列LANGUAGE_ID唯一,它将仅允许LANGUAGE表中的那些条目数,即如果LANGUAGE表包含 2 条目,则允许您在TRANSLATIONS表中仅插入 2 行,正如我已经说过这样做没有任何好处。