Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа

#java #mysql #jdbc

#java #mysql #jdbc

Вопрос:

Кто-нибудь знает, что не так с моим кодом? Я использую простой оператор INSERT (в отличие от обычного PreparedStatement, потому что я пытаюсь использовать функции MySQL AES_ENCRYPT / DECRYPT). Я не знаю, как использовать их с обычной настройкой PreparedStatements. со всеми странными вопросительными знаками.

Я продолжаю получать классическую:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа ( video_game_db . login , ССЫЛКИ на login_ibfk_1 ВНЕШНИЙ КЛЮЧ ( cust_ID ) customer ( cust_ID ))

Конечно, это сводит меня с ума.

Я провел всю ночь, пытаясь заставить работать обычную реализацию шифра «stuff» на JDBC. В итоге я смог только зашифровать строки, но не смог их расшифровать. Я подумал, что это должно было что-то сделать с MySQL в отличие от JDBC, поскольку до того, как я ввел их в базу данных, они нормально расшифровались, но после этого я смог заставить это работать.


Пожалуйста, взгляните на мои инструкции JDBC table DDL и DML ниже:

DDL

 Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE customer(" "cust_ID CHAR(10) NOT NULL," "PRIMARY KEY(cust_ID)," "first_Name CHAR(30)NOT NULL,mI CHAR(2),last_Name CHAR(50)NOT NULL,street_Name CHAR(50),city CHAR(30) NOT NULL,state CHAR(50) NOT NULL,"
             "zip_Code CHAR(5) NOT NULL, home_Phone CHAR(12) UNIQUE, referrer CHAR(30), quantity INTEGER NOT NULL, item_No CHAR(10))"); 
s.executeUpdate("CREATE TABLE login (" "user_Name CHAR(50) NOT NULL," "PRIMARY KEY(user_Name)," "pass_Word CHAR(50)NOT NULL, cust_ID CHAR(10))");  
  

DML

 public static void setCustTable(String cust_ID, String lName, String fName, String mI, String street_Name, String city, String state,
  String zip_Code, String home_Phone, String referrer, int quantity, String itemNo)throws IOException, SQLException 
{

// connect to database
try
{    

    PreparedStatement stat = conn.prepareStatement("INSERT INTO customer (cust_ID, first_Name, mI, last_Name, street_Name, city, state, zip_Code, home_Phone, referrer, quantity, item_No)"
                  " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");

    stat.setString(1, cust_ID);
    stat.setString(2, fName);
    stat.setString(3, mI);
    stat.setString(4, lName);
    stat.setString(5, street_Name);
    stat.setString(6, city);
    stat.setString(7, state);
    stat.setString(8, zip_Code);
    stat.setString(9, home_Phone);
    stat.setString(10, referrer);
    stat.setInt(11, quantity);
    stat.setString(12, itemNo);

    stat.executeUpdate();
}  

 catch (SQLException e) 
{
    e.printStackTrace();
    throw e;
}

**********************************************************************************



public static void insertLoginData(String username5, String password5, String custID5)throws IOException, SQLException, NoSuchAlgorithmException, InvalidKeyException

{
    Statement s = conn.createStatement();
    String insert="INSERT INTO login VALUES('username5', AES_ENCRYPT('text','password5'),'custID5')";
    s.executeUpdate(insert);
  

Ответ №1:

Как бы то ни было, я не вижу никакой вставки в customer . Сообщение об ошибке сообщает, что существует ограничение внешнего ключа при входе в систему для клиента. Таким образом, запись клиента должна существовать до вставки входа в систему.


Было ли намерение указать ‘username5’? Я думаю, что это параметр для метода, но insert использует литерал.

Комментарии:

1. Клиент уже заполнен. Я просто пытался сократить код для вас, ребята. Я добавлю это на всякий случай.

2. По иронии судьбы, я смог использовать PreparedStatement в JDBC, и оператор customer insert работает как шарм . , , есть ли обходной путь для очевидного несоответствия между JDBC и MySQL, когда дело доходит до шифрования? Должно быть. Я получил книгу по CoreJava, и все, что она делает, это показывает мне, как шифровать файлы? Какая польза в том, что вы пытаетесь зашифровать пароли . . . Хорошо . . . извините . . . просто расстроен. Не спал более 3 часов в сутки, работая над этим проклятым проектом. . извините за напыщенную речь . . .

3. @Mike: Происходит ли заполнение клиентской базы в той же транзакции, что и login? Если транзакции являются отдельными, является ли та, в которую вставляется клиент, уже зафиксированной ко времени запуска транзакции для вставки входа в систему?

4. Да, таблица customer заполняется непосредственно перед заполнением таблицы login.

5. @Mike что я предлагаю попробовать для отладки, так это поместить запрос select прямо перед вставкой входа и использовать одну и ту же переменную для cust_ID в обоих.