簡體   English   中英

SQL錯誤:SQLSTATE [23000]:完整性約束違規:1452無法添加或更新子行:外鍵約束失敗

[英]SQL error : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

我有一些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 ;

我的第一個表單發送值以確保表,它工作正常。 我的第二個意思是將值發送到vehicule和contrat_assurance表; 檢查表單后,瀏覽器顯示:

ERREUR:SQLSTATE [23000]:完整性約束違規:1452不能添加或更新子行,外鍵約束失敗( aaavehicule ,約束vehicule_ibfk_1外鍵( id_assure )參考assureid_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代碼是錯誤的。

UPDATE2:這是將id_assure插入到保證表(它是vehicule表中的FK)的PHP代碼:

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());
        }

問題是,當您插入到vehicule ,您需要指定外鍵,即您需要將值插入其中,並且該值需要存在於引用表中。 在這種形式中,您插入的唯一列是id_vehicule和immatriculation,這意味着id_assure將保持為空,這意味着約束將失敗。

也許您在查詢中聯系ukrnow鍵。 當我將表格性別綁定到用戶時,我遇到了類似的問題。這個包中的未知 密鑰通過外鍵表連接的性別參見ERROR 1452 在此輸入圖像描述

和table1有什么不同的鍵在table2中沒有

在此輸入圖像描述

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM