GreenDao insert 解决 PRIMARY KEY must be unique (code 19)


1. 如果主键标记时没有添加autoincrement , 那么就是传的id重复了, 传的时候获取最新id然后++id即可, 这里不讨论

@Id(autoincrement = true)


2. 我明明标了autoincrement , 按理不用传id的, 也确实没传, 还爆not unique的话, 就是踩坑了

GreenDao的主键必须设置成包装类 Long , 大写L

原因就在这里 :  如果主键设置为包装类Long类型, 那么在生成的Dao类中会有一个判断非null才插入
private Long _id;

@Override
protected final void bindValues(SQLiteStatement stmt, IdCache entity) {
    stmt.clearBindings();

    Long _id = entity.get_id();
    if (_id != null) {
        stmt.bindLong(1, _id);
    }
    stmt.bindString(2, entity.getUser());
}

但是如果写的是 long, 就无脑写进去了, 也就是说即使不传值,也会insert _id = 0, 于是报异常;
@Id(autoincrement = true)
private long _id;

@Override
protected final void bindValues(DatabaseStatement stmt, IdCache entity) {
    stmt.clearBindings();
    stmt.bindLong(1, entity.get_id());
    stmt.bindString(2, entity.getUser());
}




Query: CREATE TABLE employees ( employee_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique employee ID', first_name VARCHAR(50) NOT NULL COMMENT 'Employee first name', last_name VARCHAR(50) NOT NULL COMMENT 'Employee last name', email VARCHAR(100) NOT NULL UNIQUE COMMENT 'Google email (must end with @google.com)', hire_date DATE NOT NULL COMMENT 'Date hired at Google', job_title VARCHAR(100) NOT NULL COMMENT 'Current job position', department ENUM( 'Engineering', 'Product Management', 'Sales', 'Marketing', 'HR', 'Finance', 'Legal', 'Research' ) NOT NULL COMMENT 'Department name', salary DECIMAL(10,2) NOT NULL CHECK (salary > 0) COMMENT 'Annual base salary', manager_id INT UNSIGNED NULL COMMENT 'Manager employee ID', is_active BOOLEAN NOT NULL DEFAULT TRUE COMMENT 'Employment status', last_promotion_date DATE NULL COMMENT 'Most recent promotion date', CONSTRAINT chk_email_format CHECK (email LIKE '%@google.com'), CONSTRAINT fk_manager FOREIGN KEY (manager_id) REFERENCES employees(employee_id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Google employee records' Error occured at:2025-12-15 18:42:05 Line no.:29 Error Code: 1050 - Table 'employees' already exists Query: CREATE TABLE employees ( employee_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique employee ID', first_name VARCHAR(50) NOT NULL COMMENT 'Employee first name', last_name VARCHAR(50) NOT NULL COMMENT 'Employee last name', email VARCHAR(100) NOT NULL UNIQUE COMMENT 'Google email (must end with @google.com)', hire_date DATE NOT NULL COMMENT 'Date hired at Google', job_title VARCHAR(100) NOT NULL COMMENT 'Current job position', department ENUM( 'Engineering', 'Product Management', 'Sales', 'Marketing', 'HR', 'Finance', 'Legal', 'Research' ) NOT NULL COMMENT 'Department name', salary DECIMAL(10,2) NOT NULL CHECK (salary > 0) COMMENT 'Annual base salary', manager_id INT UNSIGNED NULL COMMENT 'Manager employee ID', is_active BOOLEAN NOT NULL DEFAULT TRUE COMMENT 'Employment status', last_promotion_date DATE NULL COMMENT 'Most recent promotion date', CONSTRAINT chk_email_format CHECK (email LIKE '%@google.com'), CONSTRAINT fk_manager FOREIGN KEY (manager_id) REFERENCES employees(employee_id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Google employee records' Error occured at:2025-12-15 18:42:52 Line no.:29 Error Code: 1050 - Table 'employees' already exists 这怎么解决
最新发布
12-16
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值