无法为已存在的表添加外键约束,报错引用无效列
问题描述
我创建了如下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代码
- 修正
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
- 修正
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
相关产品推荐
相关产品推荐

