SQL代码报错‘relation "spel"不存在’,请求排查原因
问题分析与解决
错误提示"ERROR: relation 'spel' does not exist"的核心原因是脚本开头的ALTER TABLE Spel语句在DROP TABLE之前执行:
- 首次运行脚本时,
Spel表还未创建,执行修改表的操作自然会提示表不存在; - 重复运行脚本时,
DROP TABLE IF EXISTS Spel会删除表,但这两句ALTER是在DROP之前执行的,同样会找不到目标表。
具体修复步骤
移除冗余的ALTER语句
DROP TABLE IF EXISTS会自动删除表的所有关联约束,所以开头的两句删除约束的ALTER完全多余,直接删掉即可。如果是单独维护约束的场景需要保留,要把它们移到CREATE TABLE Spel之后,并且加上IF EXISTS避免约束不存在时报错:ALTER TABLE Spel DROP CONSTRAINT IF EXISTS spel_spelid_fkey; ALTER TABLE Spel DROP CONSTRAINT IF EXISTS spel_namn_fkey;调整表的创建顺序(更规范的做法)
外键约束要求被引用的表必须先存在,所以应该先创建Företag和Plattform,再创建Spel,这样可以在创建Spel时直接定义外键,不需要后续ALTER:DROP TABLE IF EXISTS Spel; DROP TABLE IF EXISTS Plattform; DROP TABLE IF EXISTS Företag; CREATE TABLE Företag ( FöretagID varchar(50) PRIMARY KEY, Företag text, Högk text ); CREATE TABLE Plattform ( PlattformID integer, Plattform varchar (50), PRIMARY KEY (PlattformID, Plattform), -- 新增唯一约束:因为Spel的外键引用PlattformID,必须确保该列唯一 UNIQUE (PlattformID) ); CREATE TABLE Spel ( SpelID integer PRIMARY KEY REFERENCES Plattform(PlattformID), namn varchar(50) REFERENCES Företag(FöretagID), genre text, år date, Åldergräns char(2) );修复潜在的外键引用问题
原脚本中Plattform的主键是复合键(PlattformID, Plattform),但Spel的外键只引用PlattformID,这会导致报错——外键引用的列必须是唯一约束或主键。所以需要给Plattform的PlattformID添加UNIQUE约束,如上面的代码所示。
内容的提问来源于stack exchange,提问作者medina_01
相关产品推荐
相关产品推荐

