Ошибка SQL: SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа

У меня есть некоторые проблемы с PHP и SQL, PHP является новым для меня, и у меня нет SQL.

Я хочу добавить значения в таблицы моей базы данных: значения либо взяты из формы, либо взяты из другой таблицы (как FK).

Вот база данных:

create database AAA;
use AAA;

create table assure(
id_assure varchar(13) not null,
nom varchar(20),
adresse varchar(50), mdp varchar(60),
primary key(id_assure));

create table vehicule(
id_vehicule varchar(13) not null,
immatriculation varchar(7),
masse int(4),
volume int(4),
id_assure varchar(13) not null,
primary key(id_vehicule),
foreign key(id_assure) references assure(id_assure));

create table reparation(
id_reparation varchar(13) not null,
libelle varchar(100),
couts int(5),
primary key(id_reparation),
id_vehicule varchar(13) not null,
foreign key(id_vehicule) references vehicule(id_vehicule));


create table sinistre(
id_sinistre varchar(13) not null,
libelle varchar(100),
date_sinistre date,
heure_sinistre time,
primary key(id_sinistre),
id_vehicule varchar(13) not null,
foreign key(id_vehicule) references vehicule(id_vehicule));

create table dossier(
id_dossier varchar(13) not null,
primary key(id_dossier),
id_sinistre varchar(13) not null,
foreign key(id_sinistre) references sinistre(id_sinistre));

create table contrat_assurance(
id_assurance varchar(13) not null,
primary key(id_assurance),
id_assure varchar(13)  not null,
id_vehicule varchar(13) not null,
foreign key(id_assure) references assure(id_assure),
foreign key(id_vehicule) references vehicule(id_vehicule));

create table type_garantie(
code_garantie varchar(13) not null,
libelle varchar(100),
franchise int(3) ,
primary key(code_garantie),
id_assurance varchar(13) not null,
id_reparation varchar(13) not null,
foreign key(id_reparation) references reparation(id_reparation),
foreign key(id_assurance) references contrat_assurance(id_assurance));


DELIMITER //
CREATE TRIGGER trigfranchise
BEFORE INSERT ON type_garantie
for EACH ROW
BEGIN
IF NEW.franchise not between 150 and 600

THEN
SET NEW.franchise = NULL ;
END IF;
END ;//
DELIMITER ;

DELIMITER //
CREATE TRIGGER trigfranchise1
BEFORE UPDATE ON type_garantie
for EACH ROW
BEGIN
IF NEW.franchise not between 150 and 600

THEN
SET NEW.franchise = OLD.franchise ;
END IF;
END ;//
DELIMITER ;

Моя первая форма отправляет значения, чтобы убедиться, что таблица работает нормально.
Мой второй предназначен для отправки значений в таблицу vehicleule и contrat_assurance; после проверки формы браузер отображает:

Ошибка: SQLSTATE [23000]: нарушение ограничения целостности: 1452 Не удается
добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено
(aaa,vehicule, ОГРАНИЧЕНИЕ vehicule_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ
(id_assure) РЕКОМЕНДАЦИИ assure (id_assure))

Мой PHP-код выглядит следующим образом:

try
{
$nom=mysql_real_escape_string($_POST["nom"]);
$mdp=mysql_real_escape_string($_POST["mdp"]);
$imma=mysql_real_escape_string($_POST["immatriculation"]);

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=AAA', 'root', '',   $pdo_options);

$req = $bdd->prepare('INSERT INTO vehicule (id_vehicule, immatriculation) VALUES(:id_vehicule, :immatriculation)');

$req->execute(array(
'id_vehicule' => uniqid(),
'immatriculation' => $imma
));


$req2 =  $bdd->prepare("INSERT INTO vehicule (id_assure)  SELECT id_assure FROM assure WHERE nom =\"$nom\" AND mdp =\"$mdp\"" );



$req3 = $bdd->prepare('INSERT INTO contrat_assurance (id_assurance) VALUES(:id_assurance)');
$req4 =  $bdd->prepare("INSERT INTO contrat_assurance (id_assure, id_vehicule)  SELECT id_assure, id_vehicule FROM vehicule WHERE immatriculation =\"$imma\"");

$req3->execute(array(
'id_assurance' => uniqid()

));



}

На самом деле, я нашел другие темы об этой ошибке, из-за моих слабых навыков я не могу сопоставить ответы с моей проблемой.

Извините за плохие английские и французские названия таблиц.

Спасибо, что прочитали!

ОБНОВЛЕНИЕ: я попытался добавить значения через терминал (без PHP), это сработало, поэтому мой код PHP неверен.

ОБНОВЛЕНИЕ 2: Вот код PHP, который вставляет id_assure в таблицу уверенности (которая является FK в таблице транспортных средств):

try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=AAA', 'root', '',   $pdo_options);

$req = $bdd->prepare('INSERT INTO assure(id_assure, nom, adresse, mdp) VALUES(:id_assure, :nom, :adresse, :mdp)');
$req->execute(array(
'id_assure' => uniqid(),
'nom' => $_POST['nom'],
'adresse' => $_POST['adresse'],
'mdp' => $_POST['mdp']
));


}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}

4

Решение

Проблема в том, когда вы вставляете в vehiculeВам необходимо указать внешний ключ, т. е. вам нужно вставить в него значение, и это значение должно существовать в ссылочной таблице. В этой форме единственными столбцами, в которые вы вставляете, являются id_vehicule и immatriculation, что означает, что id_assure останется пустым, что означает, что ограничение не будет выполнено.

1

Другие решения

Может быть, вы обращаетесь к ukrnow ключу в запросе.
У меня была проблема симуляции, когда я связывался таблицы пола для пользователей.Эта сумка в неизвестный ключ в пол в том, что у вас есть подключение через таблицы внешних ключей
См. ОШИБКА 1452
введите описание изображения здесь

И table1, что имеют разные ключи, которые не имеют в table2

введите описание изображения здесь

введите описание изображения здесь

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector