对我很轻松,中学老师参加CS课程。我有一个Java程序,询问用户名,身高,体重,做一些计算并给用户带来结果。我现在需要将这些数据存储在数据库中。在开始使用主键和外键之前,我可以将数据存储起来。
这是我无法弄清楚的错误: 错误:java.sql.SQLIntegrityConstraintViolationException:语句已中止,因为它会在唯一或主键约束或由' SQL180429151131780'标识的唯一索引中导致重复键值。在' USERPROFILE'。
上定义这是我的表:
drop table stayfitapp.userdata;
drop table stayfitapp.userprofile;
drop schema stayfitapp restrict;
create schema stayfitapp;
create table stayfitapp.userprofile
(
profileName varchar(255) not null primary key,
profileGender varchar(255) not null
);
create table stayfitapp.userdata
(
profileAge double not null,
profileWeight double not null,
profileHeight double not null,
profileWaistCircumference double not null,
profileHipCircumference double not null,
profileName varchar(255),
foreign key (profileName) references stayfitapp.userprofile(profileName)
);
这是" app"的部分。写入表...
public void save(){
try {
String query = "insert into stayfitapp.userprofile" + "(profileName, profileGender)" + "values" + "(?,?)";
String query2 = "insert into stayfitapp.userdata" + "(profileAge, profileWeight, profileHeight, profileWaistCircumference, profileHipCircumference)" + "values" + "(?,?,?,?,?)";
Connection myConnection = DriverManager.getConnection("jdbc:derby://localhost:1527/stayfitDB2", "username", "password");
Statement myStatement = myConnection.createStatement();
//Statement myStatement2 = myConnection.createStatement();
PreparedStatement prepared = myConnection.prepareStatement(query);
prepared.setString(1, profileName);
prepared.setString(2, profileGender);
PreparedStatement prepared2 = myConnection.prepareStatement(query2);
prepared2.setDouble(1, profileAge);
prepared2.setDouble(2, profileWeight);
prepared2.setDouble(3, profileHeight);
prepared2.setDouble(4, profileWaistCircumference);
prepared2.setDouble(5, profileHipCircumference);
int rowsAffected = prepared.executeUpdate();
int rowsAffected2 = prepared2.executeUpdate();
if(rowsAffected==0)
{
System.out.println("Warning: User data did not save!");
}
else
{
System.out.println("User info saved!");
}
}
catch(SQLException e)
{
System.out.println("Error: "+e.toString());
}
答案 0 :(得分:1)
您的save()方法将尝试将用户添加到stayfitapp.userprofile表。该表有一个名为profileName的字段。 profileName是“主键”,因此不允许重复值。 您收到的错误是说您无法将记录添加(插入)到表中,因为该表已有一个具有相同名称的记录。 如果每次使用不同的名字,你的程序是否正常工作?
您需要在程序中添加一些逻辑来处理表中已存在profileName的场景。这可能涉及删除或更新现有记录。
答案 1 :(得分:0)
这就是问题所在。
insert into stayfitapp.userprofile"
+ "(profileName, profileGender)" + "values" , etc
您无需查看记录是否已存在。这样的事情会更好。
insert into stayfitapp.userprofile
profileName, profileGender
select distinct ?, ?
from someSmallTable
where not exists (
select 1
from stayfitapp.userprofile
where profileName = ?
)
someSmallTable位取决于您没有指定的数据库引擎。
答案 2 :(得分:0)
我最后写了一个方法来检查用户名是否已经在配置文件表中。如果用户名是重复的,我只写入数据表。如果用户名是新的,我写信给两个表。
感谢您的帮助!我确信有一种更有效的方法(比喻和字面意义),但我已经完成了我的最终项目并且几乎幸免于实际的CS课程。