Java & SQL - не могу создать повторяющиеся значения в моем первичном и внешнем ключе - PullRequest
0 голосов
/ 29 апреля 2018

Полегче на меня, учитель средней школы, посещающий занятия 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)
);

Вот раздел "приложения", который пишет в таблицу ...

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 голосов
/ 30 апреля 2018

Это проблема.

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 зависит от механизма базы данных, который вы не указали.

0 голосов
/ 30 апреля 2018

Я закончил писать метод, чтобы проверить, было ли имя пользователя уже в таблице профиля. Если имя пользователя было дубликатом, я только записывал в таблицу данных. Если имя пользователя было новым, я записывал в обе таблицы.

Спасибо за вашу помощь! Я уверен, что был более эффективный метод (фигурально и буквально), но я продолжаю свой последний проект и почти выживаю в настоящем классе CS.

0 голосов
/ 29 апреля 2018

Ваш метод save () попытается добавить пользователя в таблицу stayfitapp.userprofile. Эта таблица имеет поле с именем profileName. profileName является «первичным ключом», поэтому повторяющиеся значения не допускаются. Ошибка, которую вы получаете, говорит о том, что вы не можете добавить (вставить) запись в таблицу, потому что в таблице уже есть запись с тем же именем. Ваша программа работает нормально, если вы каждый раз используете другое имя?

Вам потребуется добавить некоторую логику в вашу программу, чтобы иметь дело со сценарием, в котором profileName уже существует в таблице. Это, вероятно, потребует удаления или обновления существующей записи.

...