如何在 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 中为自动增量表创建查询?的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 如何使用自动增量更新表(值++)[重复]

如何在 Access 2010 的选择查询中创建自动增量字段?

如何在 MySql 查询中为类似 Instagram 的帖子创建视图?

如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?

如何将自动增量 ID 列添加到从 SQL 查询生成的表中? [复制]

如何在 phpMyAdmin 中使用自动增量