java.sql.SQLException:尝试从java插入数据库时,密钥的条目重复
这是我的mysql表java.sql.SQLException:尝试从java插入数据库时,密钥的条目重复,java,mysql,sql,sql-server,jdbc,Java,Mysql,Sql,Sql Server,Jdbc,这是我的mysql表 CREATE TABLE `mydb`.`mytab` ( `email` VARCHAR(45) NOT NULL, `name` VARCHAR(45) NULL, PRIMARY KEY (`email`)); 我的java代码是 Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localh
CREATE TABLE `mydb`.`mytab` (
`email` VARCHAR(45) NOT NULL,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`email`));
我的java代码是
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/spacespacer", "root", "");
PreparedStatement state=con.prepareStatement("INSERT INTO `spacespacer`.`mytab` VALUES (?, ?);");
state.setString(1, "email");
state.setString(2, "name");
state.executeUpdate();
这就是我在netbeans中运行文件时得到的结果
run:
Exception in thread "main" java.sql.SQLException: Duplicate entry 'email' for key 'PRIMARY'
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1347)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:958)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1957)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1880)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1741)
at spacespacer.SpaceSpacer.main(SpaceSpacer.java:30)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
那么我如何让它工作呢
感谢您的回复在您的表格中,您已经有了一个带有“email”的条目 在此表列中,电子邮件设置为PrimaryKey。因此,复制是不可能的 注:
您的表位于数据库
mydb
下的mytab
。但是您正在插入spacespacespacer.mytab
这是因为您的表中已经有了“email”,您已经将其设置为主键。因此,您无法添加更多名为“电子邮件”的电子邮件。尝试查询您的表以检查您是否已经有该记录。建议不要将电子邮件用作主键。它将导致索引和搜索速度缓慢,因为它是一个varchar,并且可能很长。不要使用“email”作为键,即使它是唯一的。根据经验,使用int
或long
作为主键。检查您尝试插入的值,然后检查它是否已在表中。错误表明您正试图在主键字段中插入相同的值,该字段仅允许该值一次。哦,好的,我在中已经有一个名为“email”的值,谢谢您的回答!当我使用语句时,无法在java中检索生成的键。getGeneratedKeys()它只显示在java中插入的行数,而不是实际的行数keys@AminePaleo使用ps=connection.prepareStatement(查询、语句、返回\u生成的\u键)
和ps.executeUpdate()之后
您可以通过ps.getGeneratedKeys()
在结果集中获取生成的键。