You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite如何强制transactions表中两个参与者ID列取值不同?

解决SQLite交易表中参与者不能为同一用户的约束问题

先修正下原建表语句的小错误(transactions表的id行末尾少了个逗号),然后直接用CHECK约束就能实现你要的效果——强制两个参与者ID不同,同时不限制同一用户对的多次交易。

最终建表语句

CREATE TABLE users(
  id INTEGER PRIMARY KEY ASC
);

CREATE TABLE transactions(
  id INTEGER PRIMARY KEY ASC,
  participant_1_id INTEGER REFERENCES users(id),
  participant_2_id INTEGER REFERENCES users(id),
  CHECK(participant_1_id != participant_2_id)
);

方案说明

  • CHECK(participant_1_id != participant_2_id)会直接验证插入或更新的记录,确保两个参与者ID不能相等,完美阻止用户和自己交易的情况。
  • 和UNIQUE约束不同,这个约束不会限制同一用户对的多次交易,比如(1,2)的组合可以反复插入,完全符合你的业务需求。

验证效果

如果尝试插入同一用户的交易:

INSERT INTO transactions(participant_1_id, participant_2_id) VALUES(1, 1);

SQLite会直接抛出CHECK constraint failed: transactions的错误,阻止这条非法数据入库。

已有表添加约束的方法

如果你的transactions表已经存在,无法直接添加CHECK约束,可以按以下步骤操作:

  1. 新建一个带约束的临时表
  2. 迁移原表数据(需确保原数据中没有用户和自己交易的记录)
  3. 替换原表

代码示例:

-- 新建带约束的表
CREATE TABLE transactions_new(
  id INTEGER PRIMARY KEY ASC,
  participant_1_id INTEGER REFERENCES users(id),
  participant_2_id INTEGER REFERENCES users(id),
  CHECK(participant_1_id != participant_2_id)
);

-- 迁移数据
INSERT INTO transactions_new SELECT * FROM transactions;

-- 替换原表
DROP TABLE transactions;
ALTER TABLE transactions_new RENAME TO transactions;

内容的提问来源于stack exchange,提问作者Rares Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:52:34