3

このコードの問題は何ですか?? 「別の制約で既に使用されている名前」というエラーが発生します。また、異なるテーブルで同じ制約を定義できない場合、以前に定義した制約を再利用する方法はありますか?

洞察はありますか??

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)
);

テーブル 'tbl_client_formats' で定義されている外部キー制約 'fk_format_id' が、テーブル 'tbl_format_detail' で既に定義されている同じ制約と競合しているようです。私はオラクルが初めてなので、明白なことでも説明してください。

4

2 に答える 2

4

問題は、同じ制約名を 2 回使用しようとしていることです。2 番目の制約に別の名前 (例: fk_client_formats_format_id) を使用するだけで問題ありません。

一般に、名前の競合を避けるために、テーブル名を制約名の一部として使用することをお勧めします (制約名が長くなりすぎる場合は、何らかの省略形を使用する必要があります)。

于 2012-11-29T09:58:33.027 に答える
1

外部キーは、テーブル範囲ではなくデータベース範囲に格納されます。同じテーブルになくても、同じデータベースに同じ名前の 2 つの FK を持つことはできません。次のように FK に名前を付けることができます。

FK_PARENT_CHILD_FIELD

元:

FK_FORMATDETAILS_FORMATS_ID、

FK_CLIENTFORMATS_FORMATS_ID、

FK_CLIENTFORMATS_CLIENT_ID

于 2012-11-29T09:58:43.433 に答える