2015-05-25 166 views
4

我对PHP和SQL有一些问题,PHP对我来说是新手,我缺少SQL。SQL错误:SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败

我想在我的数据库的表中添加值:值可以从表单中获取,也可以从其他表中获取(如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外国。 KEY (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:这里是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()); 
     } 

回答

1

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

+0

我已经写了一个表单和一个插入id_assure值的php代码。 – Aleks

+0

检查UPDATE2中的PHP代码(我的第一篇文章) – Aleks

+0

@Aleks你正在插入'uniqid()',它是一个随机唯一的ID。这是错误的,你应该在相关条目中插入“确保”表 –

1

也许你在查询中联系到ukrnow键。 我有simular问题,当我在未知关键在性别你必须通过 见外键的表连接什么绑定表性别用户。这袋ERROR 1452 enter image description here

和表1你有什么不同的关键是什么表2中

enter image description here

enter image description here

没有3210
+0

请停止发布多个问题的相同答案。您的答案需要针对每个问题进行大量调整。如果您觉得有两个问题完全相同以保证完全相同的答案,请将其标记为重复。 – meagar

相关问题