Моя вставка в заявление не работает - PullRequest
0 голосов
/ 10 декабря 2011

Я работал с пользовательскими интерфейсами, где пользователь нажимал кнопку добавления, чтобы добавлять сотрудников, но когда я это делаю, это выдает мне такую ​​ошибку

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`finalpayroll`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` 

Как бы я это исправить ?? Я знаю, что использую родительский ключ, а его внешний ключ - Пользователь, и также учтите, что у родительского ключа уже есть данные, но, похоже, мой запрос не будет работать, почему? Я использую внешний ключ с каскадом удаления и каскадом обновления, чтобы при удалении данных были удалены все строки дочерней таблицы, и наоборот. вот мой ключ для добавления или вставки операторов

public void addEmployee(Personal p ,Contact c,Employee e) {
    Connection conn = Jdbc.dbConn();
    Statement statement = null;
    String insert1 = "INSERT INTO personal_info (`First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`) VALUES ('"+p.getFirstName()+"', '"+p.getMiddleInitial()+"'" +
                "       , '"+p.getLastName()+"', '"+p.getDateOfBirth()+"', '"+p.getMaritalStatus()+"', '"+p.getBeneficiaries()+"')";
    try {
        statement = conn.createStatement();
        statement.executeUpdate(insert1);
        statement.close();
        conn.close();
        JOptionPane.showMessageDialog(null, "Employee Added!!");
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

Таблица пользователей:

CREATE TABLE `users` (
  `idusers` int(11) NOT NULL AUTO_INCREMENT,
  `emp_id` varchar(45) DEFAULT NULL,
  `emp_pass` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idusers`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Таблица личных данных:

CREATE TABLE `personal_info` (
    `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT,
    `First_Name` varchar(45) DEFAULT NULL,
    `Middle_Initial` varchar(45) DEFAULT NULL,
    `Last_Name` varchar(45) DEFAULT NULL,
    `Date_Of_Birth` varchar(45) DEFAULT NULL,
    `Marital_Status` varchar(45) DEFAULT NULL,
    `Beneficiaries` varchar(45) DEFAULT NULL,
    PRIMARY KEY (`idpersonal_info`),
    CONSTRAINT `personal_info_ibfk_1`
    FOREIGN KEY (`idpersonal_info`)
    REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

Вы пытаетесь вставить запись с 6 полями: First_Name, Middle_Initial, Last_Name, Date_Of_Birth, Marital_Status и Beneficiaries. Ваша схема в настоящее время неизвестна, но ни одно из этих полей не является подходящим внешним ключом для идентификатора таблицы User, которую вы упомянули. Таким образом, я думаю, что есть значение по умолчанию для этого столбца внешнего ключа, и это значение по умолчанию отсутствует в таблице User.

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

Я добавляю эту информацию относительно ваших вопросов в комментариях и обновляю ваш вопрос:

Внешний ключ - это ссылка между дочерней таблицей и родительской таблицей, personal_info и users таблиц в вашем случае соответственно. Столбец внешнего ключа дочерней таблицы должен ссылаться на значение ключа в родительской таблице, что означает, что для каждого значения в столбце FK дочерней таблицы должно быть значение в связанном столбце родительской таблицы.

Теперь, в вашем случае, когда вы пытаетесь вставить новую запись personal_info, MySQL назначает ей idpersonal_info, поскольку вы определили ее как автоинкремент. Но поскольку имеется ссылка на таблицу пользователей, MySQL ищет новый idpersonal_info для вставки в столбец idusers таблицы пользователей. И поскольку вы получаете это исключение, у вас наверняка нет этого значения в таблице пользователей.

Вы можете изменить структуру таблицы следующим образом:

CREATE TABLE `personal_info` (
  `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,

  ... OTHER FIELD DEFINITIONS,

  PRIMARY KEY (`idpersonal_info`),
  CONSTRAINT `user_id_fk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

И ваш запрос должен включать также поле user_id. Так будет примерно так:

INSERT INTO personal_info
  (`user_id`, `First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`)
VALUES ( .... SET YOUR VALUES HERE. DON'T FORGET TO SET A VALID USER_ID
0 голосов
/ 10 декабря 2011

Ошибка означает, что вы пытаетесь вставить значение в столбец с внешним ключом, значение которого отсутствует в удаленной таблице.

Я предполагаю, что существует пользовательский столбец, которым мы являемсяне видяПоскольку вы не устанавливаете значение явно, я предполагаю, что оно получает значение по умолчанию.Значение по умолчанию отсутствует в родительской таблице.

0 голосов
/ 10 декабря 2011

Похоже, что в вашей таблице Personal_Info у вас есть столбец с именем "finalpayroll", который указывает на столбец в другой таблице (внешний ключ), и он обязателен (не обнуляется). В вашей вкладке вы не придаете этому значение. Так что вы могли бы сделать этот столбец обнуляемым.

Или может быть наоборот, как @Konstantin Naryshkin говорит

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