首页 > 解决方案 > 非空约束失败

问题描述

org.sqlite.SQLiteException:[SQLITE_CONSTRAINT_NOTNULL] NOT NULL 约束失败(NOT NULL 约束失败:stock.id)

我的 SQLite DB 中有三列是id, pnamemrp但我只想将数据插入两列,然后我这样做了

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    try {
        Class.forName("org.sqlite.JDBC");
        Connection con = DriverManager.getConnection("jdbc:sqlite:qmb.db");
        String query="INSERT INTO stock(pname,mrp) VALUES('"+jTextField2.getText()+"','"+jTextField5.getText()+"');";
        executeSQlQuery(query, "Inserted");   // TODO add your handling code here:
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(UpdateStock.class.getName()).log(Level.SEVERE, null, ex);
    }
}    

我只想能够通过单击数据库中的按钮来插入行

标签: javasqlsqlite

解决方案


在 SQLite 中创建表时,您要用作主键的列(id在这种情况下)必须使用完全正确的关键字创建INTEGER PRIMARY KEY,以便其行为成为 SQLite 的轻量级版本的自动增量。这就是允许您在不提供列值的情况下添加行的原因(SQLite 会为您填写)。INT PRIMARY KEY不会这样做,也不会UNSIGNED INTEGER PRIMARY KEY,任何其他变化也不会。尝试使用INTEGER PRIMARY KEYfor 类型重新创建表id(您也可以添加NOT NULL约束)。

您可以选择将关键字添加到(即使用)AUTOINCREMENT的定义中。这将强制 SQLite 在添加新行时不重用以前删除的行的 ID,但这会更慢并且占用更多的内存和磁盘空间。idINTEGER PRIMARY KEY AUTOINCREMENT

id下面是一个示例,说明如何在 SQLite 中创建表,以便在插入行时不必填写:

CREATE TABLE stock(id INTEGER PRIMARY KEY, pname TEXT, mrp TEXT);

PS - 由于此特殊功能INTEGER PRIMARY KEY通过创建别名 from idto起作用,因此在创建表时ROWID也不应使用WITHOUT ROWID关键字。

PPS - 您没有关闭您在上面的代码中创建的 SQL 连接(我忽略了其他主要问题,但这是最重要的)。您需要在一个finally子句中这样做,以确保即使在发生异常时也关闭连接:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    Connection con = null;
    try {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:qmb.db");
        String query="INSERT INTO stock(pname,mrp) VALUES('"+jTextField2.getText()+"','"+jTextField5.getText()+"');";
        executeSQlQuery(query, "Inserted");   // TODO add your handling code here:
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(UpdateStock.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(UpdateStock.class.getName()).log(Level.WARNING, "can't close SQL connection!" , ex);
            }
        }
    }
}

推荐阅读