java - 非空约束失败
问题描述
org.sqlite.SQLiteException:[SQLITE_CONSTRAINT_NOTNULL] NOT NULL 约束失败(NOT NULL 约束失败:stock.id)
我的 SQLite DB 中有三列是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
for 类型重新创建表id
(您也可以添加NOT NULL
约束)。
您可以选择将关键字添加到(即使用)AUTOINCREMENT
的定义中。这将强制 SQLite 在添加新行时不重用以前删除的行的 ID,但这会更慢并且占用更多的内存和磁盘空间。id
INTEGER PRIMARY KEY AUTOINCREMENT
id
下面是一个示例,说明如何在 SQLite 中创建表,以便在插入行时不必填写:
CREATE TABLE stock(id INTEGER PRIMARY KEY, pname TEXT, mrp TEXT);
PS - 由于此特殊功能INTEGER PRIMARY KEY
通过创建别名 from id
to起作用,因此在创建表时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);
}
}
}
}
推荐阅读
- r - R粘贴函数为每个单词重复第一个参数
- phonegap-plugins - launchnavigator 插件构建在 phonegap buid 中出错
- javascript - 如何根据一天中的实时旋转 360° 昼夜循环图像?
- ms-access - Microsoft Access 字段添加 1
- wpf - 动态大小的工具提示的正确 XAML 是什么?
- python - 获取 groupby 多列的结果并直接在我的数据框中计数
- java - 哪些容器提供者支持 org.apache.cxf.jaxrs.JAXRSServerFactoryBean?
- windows - 使用 Powershell 解析事件日志 (ID 4725) 和输出目标用户名字段时出现问题
- c++ - 为白名单类型约束模板功能的更好方法,SFINAE?
- c++ - 关于在函数执行后如何使用和获取 return 值的问题