SQLite能否非主键查询行?如何实现network_id和username均可查询数据
SQLite 实现双字段唯一查询的方案
报错原因
SQLite 单张表仅支持设置一个主键约束,你同时为username和network_id声明两个独立主键,触发报错属于正常逻辑。
可行实现方案
你需要的是两个字段各自唯一、且都可以作为查询条件定位到唯一的value,可以选择以下任意一种方案:
方案1:单主键+单唯一约束
选其中一个字段作为主键,另一个字段添加UNIQUE约束即可满足需求,唯一约束会保证该字段不会有重复值,同时自带唯一索引,查询效率和主键一致。
建表语句示例:
CREATE TABLE Player( network_id TEXT NOT NULL UNIQUE, username VARCHAR(50) NOT NULL PRIMARY KEY, value INTEGER );
如果你更常用network_id作为查询条件,也可以调换两个字段的属性,把network_id设为主键,username加UNIQUE约束,效果完全相同。
方案2:新增独立主键+两个唯一约束
如果后续有其他表需要关联Player表,更推荐新增一个自增整数作为主键,两个业务字段分别加UNIQUE约束,整数主键的关联性能比字符串字段更好:
CREATE TABLE Player( id INTEGER PRIMARY KEY AUTOINCREMENT, network_id TEXT NOT NULL UNIQUE, username VARCHAR(50) NOT NULL UNIQUE, value INTEGER );
查询示例
配置完成后直接按对应字段查询即可:
- 按username查询:
SELECT value FROM Player WHERE username = '你要查询的用户名'; - 按network_id查询:
SELECT value FROM Player WHERE network_id = '你要查询的网络ID';
注意:不要使用联合主键实现该需求,联合主键仅能保证两个字段组合起来唯一,无法保证单个字段各自不重复,满足不了你单独用任意一个字段定位唯一记录的要求。
内容的提问来源于stack exchange,提问作者pattyport
相关产品推荐
相关产品推荐

