You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为已存在的表添加外键约束,报错引用无效列

问题描述

我创建了如下SQL表:

CREATE TABLE Artist
(
    Id INT PRIMARY KEY IDENTITY(1,1),
    FirstName varchar(50) NOT NULL,
    LastName varchar(50) NOT NULL,
    Forname varchar(50) NOT NULL
);

CREATE TABLE Song
(
    SongId INT PRIMARY KEY IDENTITY(1,1),
    Title varchar(50) NOT NULL,
    Length decimal(20, 6) NOT NULL,
    AlbumId int NOT NULL
);

由于Artist与Song是多对多关系,我创建了中间表Artist_Song,并尝试为其添加外键约束:

CREATE TABLE Artist_Song
(
    Id INT PRIMARY KEY IDENTITY(1,1),
    ArtistId int NOT NULL,
    SongId int NOT NULL
);

ALTER TABLE Artist_Song
ADD CONSTRAINT fk_artistsong_artist
FOREIGN KEY (ArtistId)
REFERENCES Artist(Id);

ALTER TABLE Artist_Song
ADD CONSTRAINT fk_artistsong_song
FOREIGN KEY (SongId)
REFERENCES Song(Id);

但持续收到错误提示:

Foreign key <fk_artistsong_song> references invalid column 'Id' in referenced table 'Song'

或

Foreign key <fk_artistsong_artist> references invalid column 'Id' in referenced table 'Artist'

我还尝试在Song_Genre表中新增列的同时添加约束:

ALTER TABLE Song_Genre
    ADD SongIdTest INT
    CONSTRAINT FK_Test
        FOREIGN KEY (SongId) 
        REFERENCES Song(Id)

但仍遇到相同问题。请问我遗漏了什么?

问题原因与解决方法

核心问题:引用了错误的列名

你的Song表主键列是**SongId**,但创建外键时错误引用了不存在的Id列,这是报错的直接原因。另外在Song_Genre的操作中,还犯了第二个错误:新增的列是SongIdTest,但约束里关联的本地列写的是不存在的SongId。

修正后的SQL代码

  1. 修正Artist_Song的外键约束:
ALTER TABLE Artist_Song
ADD CONSTRAINT fk_artistsong_artist
FOREIGN KEY (ArtistId)
REFERENCES Artist(Id); -- 这部分正确,Artist主键确实是Id

ALTER TABLE Artist_Song
ADD CONSTRAINT fk_artistsong_song
FOREIGN KEY (SongId)
REFERENCES Song(SongId); -- 将Id改为SongId
  1. 修正Song_Genre的新增列与约束:
ALTER TABLE Song_Genre
    ADD SongIdTest INT
    CONSTRAINT FK_Test
        FOREIGN KEY (SongIdTest) -- 改为新增的列名SongIdTest
        REFERENCES Song(SongId); -- 将Id改为SongId

额外优化建议

多对多中间表无需单独的Id主键,直接用关联的两个外键列组成联合主键更合理,既能保证数据唯一性,又避免冗余:

CREATE TABLE Artist_Song
(
    ArtistId int NOT NULL,
    SongId int NOT NULL,
    PRIMARY KEY (ArtistId, SongId),
    CONSTRAINT fk_artistsong_artist FOREIGN KEY (ArtistId) REFERENCES Artist(Id),
    CONSTRAINT fk_artistsong_song FOREIGN KEY (SongId) REFERENCES Song(SongId)
);

内容的提问来源于stack exchange,提问作者roderknight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:27:29