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

SQLite复合主键插入触发NOT NULL约束失败及异常求助

解决思路

1. 搞定NOT NULL constraint failed: contact.id问题

  • 先查插入逻辑:复合主键里的每一列都不能为NULL,而SQLite只有单一INTEGER PRIMARY KEY才会自动自增。你用复合主键的话,id不会自动生成值,要是插入时没给id传值,直接就触发这个错误。检查下你的插入语句,是不是漏传id字段了?比如之前单一主键时可以只传另外两个字段,复合主键下必须三个主键列都赋值。
  • 要是想让id自动生成:SQLite不支持复合主键里的自增列,得用触发器补这个逻辑。建表后加个触发器,插入时如果id为空就自动生成递增值:
    CREATE TRIGGER contact_id_autoinc
    BEFORE INSERT ON contact
    FOR EACH ROW
    WHEN NEW.id IS NULL
    BEGIN
        SELECT COALESCE(MAX(id), 0) + 1 INTO NEW.id FROM contact;
    END;
    

2. 修复AttributeError: 'SQLite_db'对象无rollback属性问题

  • 你的SQLite_db是自定义的封装类对吧?这个类里肯定没封装rollback方法,而sqlite3的原生连接对象是有rollback()的。要么给你的类加个方法:
    def rollback(self):
        self.conn.rollback()
    
    要么在异常处理时直接调用类内部的连接对象的rollback,比如db.conn.rollback()(前提是你的类把conn属性暴露出来了)。

3. 可选的替代方案

  • 要是复合主键不是必须的,可以保留单一自增id作为主键,然后加个唯一约束来保证组合唯一性:
    CREATE TABLE contact (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        uniqueid TEXT,
        pb_id INTEGER,
        UNIQUE(uniqueid, pb_id)
    );
    
    这样既保留了之前正常的插入逻辑,又能达到你要的组合唯一效果,省得折腾复合主键的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:07:14