SQL外键创建报错:引用Users表无匹配主键/候选键的问题咨询
原因分析
Users表的主键是复合主键(AccountID, Username),这意味着只有两个字段的组合值才能唯一标识一条用户记录。数据库外键约束的规则是:若引用的是复合主键,外键必须完整匹配整个主键的字段组合,不能拆分单个字段单独引用。你现在尝试用单个AccountID或Username作为外键,这两个字段本身并不是Users表的主键(也未被设置为唯一候选键),因此数据库无法找到匹配的主键/候选键,从而抛出错误。
解决方法
根据业务需求,你可以选择以下两种方案:
方案一:创建复合外键(推荐,符合原表设计逻辑)
既然用复合主键标识唯一用户,Stream表应使用AccountID+Username的组合作为外键,完整引用Users的复合主键,替换原来的两个单独外键。修改后的Stream表创建语句如下:
CREATE TABLE Stream ( StreamID int NOT NULL, AccountID int NOT NULL, "Name" CHAR(10) NOT NULL, Username NCHAR(16) NOT NULL, -- 复合外键,完整匹配Users的复合主键 FOREIGN KEY (AccountID, Username) REFERENCES Users(AccountID, Username), Description NCHAR(50), Chat TEXT, StreamCategory NCHAR(30), StreamApp NCHAR(20) PRIMARY KEY (StreamID, Username, AccountID) );
该方案会同时校验AccountID和Username的组合是否存在于Users表中,完全契合复合主键的设计逻辑。
方案二:为单个字段添加唯一约束(适用于需单独引用的场景)
如果你确实需要单独用AccountID或Username作为外键,需在Users表的这两个字段上分别添加唯一约束,让它们成为数据库认可的候选键。修改后的Users表创建语句如下:
CREATE TABLE Users ( AccountID int NOT NULL UNIQUE, -- 为AccountID添加唯一约束 Username NCHAR(16) NOT NULL UNIQUE, -- 为Username添加唯一约束 "E-mail" NCHAR(20) NOT NULL, Password NCHAR(20), BirthDate DATE, PhoneNumber NCHAR(15), FirstName CHAR(20), LastName CHAR(20) PRIMARY KEY (AccountID, Username) );
添加唯一约束后,AccountID和Username各自成为候选键,此时Stream表中原来的两个单独外键约束即可正常生效。
内容的提问来源于stack exchange,提问作者Samael
相关产品推荐
相关产品推荐

