java - 非空约束失败

标签 java sql sqlite

org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] A NOT NULL constraint failed (NOT NULL constraint failed: stock.id)

我的 SQLite 数据库中有三列,分别是 id、pname、mrp,但我只想将数据插入两列, 然后我做了这个

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);
    }
}    

我只是希望能够通过单击按钮将行插入数据库

最佳答案

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

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

下面是如何在 SQLite 中创建表的示例,这样您就不必填写 id当您插入一行时:

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

附注- 由于 INTEGER PRIMARY KEY 的特殊功能通过从 id 创建别名来工作至ROWID ,您不应该同时使用 WITHOUT ROWID创建表时的关键字。

P.P.S。 - 您没有关闭在上面的代码中创建的 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);
            }
        }
    }
}

关于java - 非空约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801114/

相关文章:

sql - 长sql事务期间断电

java - 在一行中为多个变量分配多个值

mysql - "practically"足够的数据库规范化级别是多少?

java - Android XML 解析错误 : Only one root element allowed

sql - 在 sqlite 管理器中从 sqlite 创建数据库模式

sqlite - Full Outer Join in sqlite on 4 tables

java - 在 Android 应用程序上存储每条记录或一列的 BLOBS

sql - 理解内部查询的总结

java - Spring Boot 应用程序在使用 Java 10 的 Docker 中启动时卡住

java - Android Studio 无法解析布局预览中自定义 View 的资源