Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено - PullRequest
5 голосов
/ 25 мая 2011

Кто-нибудь знает, что не так с моим кодом?Я использую простой оператор 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))

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

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


Пожалуйста, посмотрите на мой JDBCТабличные 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 Ответ

3 голосов
/ 25 мая 2011

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


Было ли намерение процитировать 'username5'?Я думаю, что это параметр метода, но вставка использует литерал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...