Java& SQL - 无法在主键和外键中创建重复值

时间:2018-04-29 20:39:17

标签: java sql netbeans derby

对我很轻松,中学老师参加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());
}

3 个答案:

答案 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课程。