SQL 错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败

Posted

技术标签:

【中文标题】SQL 错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败【英文标题】:SQL error : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 【发布时间】:2015-08-07 06:20:10 【问题描述】:

我在使用 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 ;

我的第一个表单发送值以确保表,它工作正常。 我的第二个旨在将值发送到车辆和 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 代码是错误的。

UPDATE2:这是将 id_assure 插入到保证表(车辆表中的 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());
        

【问题讨论】:

【参考方案1】:

问题是,当你插入vehicule时,你需要指定外键,即你需要向它插入值,并且值需要存在于引用表中。在这种形式中,您要插入的唯一列是 id_vehicule 和 immatriculation,这意味着 id_assure 将保持为空,这意味着约束将失败。

【讨论】:

我已经写了一个表单和一个插入 id_assure 值的 php 代码。 @Aleks 您正在插入 uniqid(),这是一个随机的唯一 ID。错了,你应该在assure表中插入相关条目的id【参考方案2】:

也许你联系到 ukrnow 键查询。 当我将 table 性别绑定到用户时,我遇到了类似的问题。unknown key 中的这个包与您通过外国连接的性别有关关键表 请参阅错误 1452

和table1有什么不同的key,table2没有什么

【讨论】:

请停止对多个问题发布相同的答案。您的答案需要针对每个问题进行实质性调整。如果您认为两个问题完全相同,足以保证完全相同的答案,请将它们标记为重复。

以上是关于SQL 错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [23000]:完整性约束违规:1048 laravel 5.7

Laravel:数据表的 SQLSTATE [23000] 错误

SQLSTATE [23000]:违反完整性约束:1217

Laravel 7 错误 - SQLSTATE [23000]:完整性约束违规:1048 列 'first_name' 不能为空

QueryException (23000) SQLSTATE[23000]:完整性约束 v1452

SQLState: 23000