如何在 Java 中为自动增量表创建查询?
Posted
技术标签:
【中文标题】如何在 Java 中为自动增量表创建查询?【英文标题】:How do I create a query in Java for auto increment table? 【发布时间】:2021-12-31 22:02:24 【问题描述】:我试图在 Java 中创建一个插入查询到 mysql 服务器,但问题是它一直在请求列“用户 ID”的值,即使我已经将它定义为 AUTO_INCREMENT。我也尝试将值设置为 NULL,但它说“列用户 id 不能为空”。
据我所知,您不必为自动增量类型定义值对吗?
查询:
String query = "INSERT INTO
user(userId, username, password, gender, country, role)
VALUES(NULL,'"+uu+"', '"+pp+"', '"+gg+"','"+cc+"', '"+rr+"')";
错误:
java.sql.SQLIntegrityConstraintViolationException:列 'userId' 不能为空
在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) 在 com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1333) 在 com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2106) 在 com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1243) 在 main.Connect.updateData(Connect.java:43) 在 main.Regis.actionPerformed(Regis.java:189) 在 javax.swing.AbstractButton.fireActionPerformed(未知来源) 在 javax.swing.AbstractButton$Handler.actionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.fireActionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.setPressed(未知来源) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源) 在 java.awt.Component.processMouseEvent(未知来源) 在 javax.swing.JComponent.processMouseEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.processMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.dispatchEvent(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Window.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$500(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知来源) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源)
表定义:
|Column |Type |Null|key|Default|Extra|
+--------+-------------+----+---+-------+-----+
|userId |int |NO |___|NULL | |
|username|varchar(255) |NO |___|NULL | |
|password|varchar(255) |NO |___|NULL | |
|gender |varchar(255) |NO |___|NULL | |
|country |varchar(255) |NO |___|NULL | |
|role |varchar(255) |NO |___|NULL | |
注意:从我得到的.sql
文件中可以看到表用户的更改表代码
ALTER TABLE `user`
MODIFY `userId` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
【问题讨论】:
Please do not upload images of code/errors when asking a question. 你能分享一下表格定义吗?发送desc user;
并通过edit发送您的帖子向我们展示
我真的不知道这个堆栈溢出的东西是如何工作的,如果我违反了一些规则,我很抱歉
只需将 userId 留在插入语句之外。
另外,不要通过连接这样的字符串来生成 SQL 语句 - 您很容易受到 SQL 注入攻击。将 PreparedStatement 与 setValue 一起使用。
【参考方案1】:
您不能将列设为 AUTO_INCREMENT,除非它有一个键(即索引)。最好是 PRIMARY KEY 或 UNIQUE KEY。
但我在您的描述表示例中看到,该列不是键:
|Field |Type |Null|key|Default|Extra|
|--------|-------------|----|---|-------|-----|
|userId |int |NO |___|NULL | |
^^^ ideally this should say "PRI"
所以你的 ALTER TABLE 使列 AUTO_INCREMENT 可能失败。您可以确认:
SHOW CREATE TABLE `user`\G
您是否看到userId
列旁边的AUTO_INCREMENT
选项?我想你不会。
您可以再次尝试将列设为主键并将其设为 AUTO_INCREMENT:
ALTER TABLE `user`
ADD PRIMARY KEY (`userId`),
MODIFY `userId` INT AUTO_INCREMENT;
不要打扰INT(255)
。整数的长度参数是一个常见的混淆来源。 It has almost no purpose or effect,它是deprecated in MySQL 8.0。
不要费心制作专栏NOT NULL
。这将在您添加 PRIMARY KEY 约束时自动发生。
不要费心设置AUTO_INCREMENT=8
。下一个 AI 值将自动设置为该列中的最大值加一。它永远不能小于该列中的最大值。
【讨论】:
【参考方案2】:试试这个代码,如果你已经定义了 userId 是一个 auto_increament 就一定可以工作。
String query = "INSERT INTO user(username,password,gender,country,role) VALUES('"+uu+"', '"+pp+"', '"+gg+"','"+cc+"', '"+rr+"')";
【讨论】:
以上是关于如何在 Java 中为自动增量表创建查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Access 2010 的选择查询中创建自动增量字段?
如何在 MySql 查询中为类似 Instagram 的帖子创建视图?
如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?