【问题标题】:Keep getting SQL error : ORA-02270: no matching unique or primary key for this column-list不断收到 SQL 错误:ORA-02270:此列列表没有匹配的唯一键或主键
【发布时间】:2022-12-14 21:38:46
【问题描述】:

我有下表:

CREATE TABLE PROPERTY 
    (PropertyID SMALLINT PRIMARY KEY, 
     Location VARCHAR(10), 
    )

CREATE TABLE OFFICE 
    (OfficeID SMALLINT, 
     PersonID SMALLINT, 
     Area VARCHAR(5), 
     PRIMARY KEY(OfficeID, PersonID) 
    )

现在,我想创建下表,但我不断收到提到的错误(ORA-02270:此列列表没有匹配的唯一键或主键)

CREATE TABLE FOR_RENT 
    (PropertyID SMALLINT, 
     OfficeID SMALLINT, 
     FOREIGN KEY(PropertyID) REFERENCES PROPERTY(PropertyID), 
     FOREIGN KEY(OfficeID) REFERENCES OFFICE(OfficeID), 
     PRIMARY KEY(PropertyID, OfficeID) 
    )

我想将 PropertyID 和 OfficeID 作为 FOR_RENT 表中的外键,但由于 OfficeID 是 Office 表中的复合键,我相信我收到了错误。我该如何解决?任何输入都会很棒

【问题讨论】:

  • 为什么 PersonIDOFFICE 表的主键的一部分?该列(无论它的用途是什么)是否应该只是 person 表的外键?
  • PersonID 是我的主键,因为仅 OfficeID 就会重复。一个办公室可以有很多人。
  • 您肯定想要一张仅供办公室使用的桌子,然后是另一张将人们与办公室联系起来的桌子吗?或者,如果每个人一次只能分配到一个办公室,那么可能是人员表中的办公室列?
  • 好吧,我不能——这就是向我提出问题的方式。如果我不改变它,有没有办法解决我的问题?
  • 您的外键必须引用匹配主键中的两列;所以你必须再次在 for_rent 表中有一个(或一个)人 - 更多冗余数据,这使得更新更加困难。这似乎并不理想......

标签: sql oracle primary-key


【解决方案1】:

正如亚历克斯评论的那样,这很可能是错误的数据模型。应该是这样的:

SQL> CREATE TABLE property
  2  (
  3     propertyid   SMALLINT PRIMARY KEY,
  4     location     VARCHAR (10)
  5  );

Table created.

SQL> CREATE TABLE person
  2  (
  3     personid   SMALLINT PRIMARY KEY,
  4     name       VARCHAR2 (20)
  5  );

Table created.

SQL> CREATE TABLE office
  2  (
  3     officeid   SMALLINT PRIMARY KEY,
  4     area       VARCHAR (5)
  5  );

Table created.

SQL> -- people work in offices
SQL> CREATE TABLE person_x_office
  2  (
  3     personid   SMALLINT CONSTRAINT fk_pxo_per REFERENCES person (personid),
  4     officeid   SMALLINT CONSTRAINT fk_pxo_off REFERENCES office (officeid),
  5     CONSTRAINT pk_pxo PRIMARY KEY (personid, officeid)
  6  );

Table created.

SQL> CREATE TABLE for_rent
  2  (
  3     propertyid   SMALLINT,
  4     officeid     SMALLINT,
  5     FOREIGN KEY (propertyid) REFERENCES property (propertyid),
  6     FOREIGN KEY (officeid) REFERENCES office (officeid),
  7     PRIMARY KEY (propertyid, officeid)
  8  );

Table created.

SQL>

......这就是给我的问题

是一个较差的对不起,从我的角度来看。你不应该仅仅因为有人告诉你就以错误的方式去做——向他们解释他们想要的是不正确的,应该改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多