2012-11-29 50 views
1

这段代码有什么问题? 它给出错误“名称已被另一个约束使用”。另外,如果我不能在不同的表中定义相同的约束,那么有什么办法可以重用先前定义的约束吗?共享相同外键的两个或多个表可以共享该外键的约束吗?

任何见解?

CREATE TABLE tbl_formats 
(
    format_id NUMBER(5), 
    format_name VARCHAR2(50), 
    format_desc VARCHAR2(100), 
    valid_from DATE, 
    valid_to DATE, 
    format_type VARCHAR2(50), 
    CONSTRAINT pk_format_id PRIMARY KEY(format_id) 
); 


CREATE TABLE tbl_format_detail 
(
    id NUMBER(10), 
    format_id NUMBER(5), 
    src_field VARCHAR2(200), 
    target_field VARCHAR2(100), 
    business_rule VARCHAR2(4000), 
    expression VARCHAR2(4000), 
    target_segment VARCHAR2(4), 

    CONSTRAINT pk_id PRIMARY KEY(id), 
    CONSTRAINT fk_format_id FOREIGN KEY(format_id) REFERENCES tbl_formats(format_id) 
); 

CREATE TABLE tbl_client_formats 
(
    client_format_id NUMBER(10), 
    format_id NUMBER(5), 
    client_id NUMBER(5), 
    CONSTRAINT pk_client_format_id PRIMARY KEY(client_format_id), 
    CONSTRAINT fk_format_id FOREIGN KEY(format_id) REFERENCES tbl_formats(format_id), 
    CONSTRAINT fk_client_id FOREIGN KEY(client_id) REFERENCES tbl_clients(client_id) 
); 

它看起来像外键约束“fk_format_id”在表“tbl_client_formats”与表“tbl_format_detail”已经定义了相同的约束冲突定义。 我是oracle新手,所以请解释明显的事情。

回答

3

问题是你试图使用相同的约束名称两次。 只需为第二个约束使用不同的名称(例如fk_client_formats_format_id),您应该没问题。

通常,我建议使用表名作为约束名称的一部分,以避免名称冲突(如果约束名称变得太长,则必须使用某种缩写方案)。

+0

感谢您的回答。我可以重复使用先前定义的约束,而不是使用不同的名称定义相同的约束吗? –

+0

每个约束都应该有其唯一的名称。您必须在重新使用之前删除以前的名称。 – ntalbs

+0

我最后的评论很混乱,所以我删除了它。我明白了。谢谢 –

1

外键存储在数据库范围内,而不是表范围。即使它们不在同一个表中,也不能在同一个数据库中拥有两个具有相同名称的FK。你能说出你的FK这样:

FK_PARENT_CHILD_FIELD

例如:

FK_FORMATDETAILS_FORMATS_ID,

FK_CLIENTFORMATS_FORMATS_ID,

FK_CLIENTFORMATS_CLIENT_ID

+0

因为正如你所说外键存储在数据库范围有什么方法可以重用以前定义的外键? –

+0

不导致FK约束特定于表列。 – goodfriend0

相关问题