【问题标题】:MSSQL There are no primary or candidate keys in the referenced tableMSSQL 引用的表中没有主键或候选键
【发布时间】:2022-01-07 15:00:59
【问题描述】:

我正在创建 3 个表(1 个父表和 2 个子表)并尝试设置外键,但出现此错误:

引用的表中没有主键或候选键。

CREATE TABLE WEATHER_FORECASTS(
    WEATHER_ID tinyint NOT NULL,
    TOWN_ID char(2) NOT NULL,
    PRIMARY KEY(WEATHER_ID, TOWN_ID)
);

CREATE TABLE WEATHER(
    WEATHER_ID tinyint NOT NULL REFERENCES WEATHER_FORECASTS(WEATHER_ID),
    WEATHER_TYPE varchar(20) NOT NULL
    PRIMARY KEY(WEATHER_ID)
);

CREATE TABLE TOWNS(
    TOWN_ID char(2) NOT NULL REFERENCES WEATHER_FORECASTS(TOWN_ID),
    TOWN_NAME varchar(20) NOT NULL
);

【问题讨论】:

  • 您的“主键”是WEATHER_IDTOWN_ID 的复合词,请参阅此了解更多信息:stackoverflow.com/questions/17879735/…
  • 您似乎误解了外键约束在哪一端。这是引用的一面,而不是被引用的一面!所以大概你想在weather_forecasts 中放置两个(不同的)外键约束,引用weathertowns。 (但是towns 也仍然错过了一个(主)键。可能你在那里忘记了town_id 上的主键约束。)如果这不是你对概念的误解,你需要详细说明你真正想要的实现(在逻辑层面上,而不是非工作解决方案),因为那时还不清楚。

标签: sql sql-server tsql


【解决方案1】:

正如@Sticky Bit 所说,你的外键方向错误,你应该在weather_forecasts 表中有两个外键引用天气和城镇表:

CREATE TABLE TOWNS(
    TOWN_ID char(2) NOT NULL,
    TOWN_NAME varchar(20) NOT NULL,
    PRIMARY KEY(TOWN_ID)
);

CREATE TABLE WEATHER(
    WEATHER_ID tinyint NOT NULL,
    WEATHER_TYPE varchar(20) NOT NULL
    PRIMARY KEY(WEATHER_ID)
);

CREATE TABLE WEATHER_FORECASTS(
    WEATHER_ID tinyint NOT NULL REFERENCES WEATHER(WEATHER_ID),
    TOWN_ID char(2) NOT NULL REFERENCES TOWNS(TOWN_ID),
    PRIMARY KEY(WEATHER_ID, TOWN_ID)
);

您可能需要考虑将索引放在 WEATHER_FORECASTS 表中的这两个外键上以提高性能。

【讨论】:

  • 您只需要 Weather_Forecasts.Town_ID 上的索引,因为 Weather_ID 是主键中的第一列,即聚集索引。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2018-12-25
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多