游戏排行榜SQL表创建遇外键约束错误,求正确关联方案
问题原因
错误提示的核心是:Names表的主键是(name, ip)复合主键,单独的name字段没有唯一约束,而你在Scores里创建的name_fk外键只引用了Names.name,数据库无法找到匹配的唯一约束来保证关联的合法性(同一个name可能对应多个不同的ip)。
修正方案
根据你的需求(每个score关联某IP下的一个name),Scores需要通过复合外键关联Names的复合主键,而不是分开关联name和ip。修改后的SQL如下:
CREATE TABLE IPs( ip CIDR NOT NULL, PRIMARY KEY(ip) ); CREATE TABLE Names( name VARCHAR(25) NOT NULL, ip CIDR NOT NULL, CONSTRAINT ip_fk FOREIGN KEY(ip) REFERENCES IPs(ip), PRIMARY KEY(name, ip) ); CREATE TABLE Scores( score INT NOT NULL, name VARCHAR(25) NOT NULL, ip CIDR NOT NULL, created_at TIMESTAMP NOT NULL, -- 用复合外键关联Names的复合主键,确保关联的是某IP下的特定name CONSTRAINT name_ip_fk FOREIGN KEY(name, ip) REFERENCES Names(name, ip), PRIMARY KEY(score, name, ip) );
额外说明
- 复合外键
(name, ip)完全匹配Names的复合主键,确保Scores里的每一条记录都对应Names中存在的「IP+名称」组合,符合你的业务需求。 - 不需要再单独给
ip创建外键关联IPs,因为Names已经关联了IPs,Scores通过Names间接关联到IPs,数据一致性已经得到保证。如果确实需要直接关联,也可以保留,但通常没必要。
内容的提问来源于stack exchange,提问作者BYTEWIFE
相关产品推荐
相关产品推荐

