2014-10-13 1 views
0

나는 데이터베이스 요리법을 만들었어요; 조리법 이름, ID 번호, 재료, 요리법, 이미지 등 그 후 나는 databese에서 검색 할 수 있도록 PHP 및 HTML 스크립트를 만들었습니다 (예 : 저녁 식사 시간은 45 분 미만). 아니요 새로운 요리법을 삽입하는 PHP 스크립트로 작업하고 있습니다. $ sql1을 삽입 할 수 있습니다. 나는 $ SQL2를 삽입 할 때 그것은 말합니다 : 데이터를 입력 할 수 없습니다 RETVAL 2 : 추가 또는 자식 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패 (. receptenbenodigdheid, CONSTRAINT benodigdheid_ibfk_1 FOREIGN KEY (ID) 참고 문헌 gerecht (ID)) 문제가 하위/상위 관계 및 외래 키에 있음을 알고 있지만 문제를 찾을 수 없습니다. 먼저 '성분'에 데이터를 추가해야합니까? 아니면 'Gerecht'에서 처음? 아래 나는 스크립트의 일부를 썼다. 필요한 경우 더 줄 수있다.문제 데이터베이스에 데이터를 삽입

PHP 스크립트는 새로운 조리법을 삽입 :

$sql1="INSERT INTO Gerecht (gerechtnaam, personen, categorie, bereidingstijd, bereidingswijze, plaatje) 
VALUES ('$gerechtnaam','$personen','$categorie','$bereidingstijd','$bereidingswijze','$plaatje')"; 
$sql2="INSERT INTO Benodigdheid (benodigdheden) 
VALUES ('$benodigdheden')"; 
$sql3="INSERT INTO Product (ingredientnaam, eenheidnaam) 
VALUES ('$ingredientnaam1', '$eenheid1')"; 
$sql4="INSERT INTO Ingredient (ingredientnaam, hoeveelheid) 
VALUES ('$ingredientnaam1', '$hoeveelheid1')"; 

$retval1 = mysqli_query($db, $sql4); 
if(! $retval1) 
{ 
    die('Could not enter data retval 1: ' . mysqli_error($db)); 
} 
echo "Entered data retval1 successfully\n"; 

$retval2 = mysqli_query($db, $sql2); 
if(! $retval3) 
{ 
    die('Could not enter data retval 2: ' . mysqli_error($db)); 
} 
echo "Entered data retval2 successfully\n"; 

스크립트 데이터베이스를 만들기 : 당신은 Benodigheid에 삽입 할 때 Gerecht의 ID를 삽입하려고하지 않는

CREATE TABLE Gerecht 
(ID  INT(3) AUTO_INCREMENT  NOT NULL, 
gerechtnaam  VARCHAR(35) NOT NULL, 
personen NUMERIC(2) NOT NULL, 
categorie VARCHAR(25) NOT NULL, 
bereidingstijd NUMERIC(3)  NOT NULL, 
bereidingswijze TEXT NOT NULL, 
plaatje  VARCHAR(250)  NOT NULL, 
PRIMARY KEY (ID) 
); 

CREATE TABLE Benodigdheid 
(ID INT(3) NOT NULL, 
benodigdheden  VARCHAR(35) NOT NULL, 
PRIMARY KEY (ID, benodigdheden), 
FOREIGN KEY (ID) REFERENCES Gerecht (ID) 
); 

CREATE TABLE Eenheid 
(eenheidnaam  VARCHAR(12) NOT NULL, 
PRIMARY KEY (eenheidnaam) 
); 

CREATE TABLE Product 
(ingredientnaam  VARCHAR(35) NOT NULL, 
eenheidnaam  VARCHAR(12), 
PRIMARY KEY (ingredientnaam), 
FOREIGN KEY (eenheidnaam) REFERENCES Eenheid (eenheidnaam) 
); 

CREATE TABLE Ingredient 
(ID INT(3)  NOT NULL, 
ingredientnaam  VARCHAR(35) NOT NULL, 
hoeveelheid  NUMERIC(4) NOT NULL, 
PRIMARY KEY (ID, ingredientnaam), 
FOREIGN KEY (ID) REFERENCES Gerecht (ID), 
FOREIGN KEY (ingredientnaam) REFERENCES Product (ingredientnaam) 
); 

답변

0

. 테이블에 참조 무결성 제약 조건이 있으므로이 값도 삽입해야합니다. 첫 번째 SQL 삽입 한 후, 당신은 아마도 mysqli_insert_id()를 사용하여 마지막으로 삽입 Gerecht 레코드 (의 ID를 읽은 다음 Benodigheid 테이블에 삽입에서 그 id 값을 추가 할 필요가 그래서 $sql2은 다음과 같아야합니다.

$sql2="INSERT INTO Benodigdheid (ID, benodigdheden) 
     VALUES ($id_from_sql1, '$benodigdheden')"; 

BenodigdheidBenodigdheid 테이블에도 자체 자동 증가 기본 키와 Gerecht을 참조하는 외래 키가 있어야한다는 결함이 있습니다. 현재 수행중인 내용을 살펴보면 GerechtBenodigheid 사이에 1 대 1의 관계가있는 것으로 보입니다. 사실 benogdigheid이 왜 Gerecht에있는 열로 표시되지 않았는지 실제로 알지 못합니다. 너의 의도 야.

일반적으로 스키마를 살펴보면, 테이블에 자동 증가 기본 키를 추가해야한다는 사실이 분명해 보입니다 (이는 대부분의 모든 관계형 DB 테이블에서 일반적으로 수행됩니다). ingredient 테이블에서 동일한 문제가 발생할 것입니다.

+0

감사합니다. Mike. 'Benodigdheid'는 부엌 용품입니다. 때때로 조리법에는 하나 이상의 주방 용품이 필요하기 때문에 내가 여분의 테이블을 만들었습니다. 한 접시에 하나의 신분증 만 있으면됩니다. 그래서 새로운 레서피를 추가 할 때 하나의 ID (자동 증가)를 만들어 다른 테이블에 사용해야합니다. 하지만 당신이 준 스크립트가 효과가 있다고 생각합니다. – sophie

+0

@sophie'Benodigheid' 테이블에 대한 합리적인 스키마는 자동 증가 기본 키,'Gerecht'에서 ID를 참조하는'berecht_id '와 같은 외부 데이터 필드 그리고 데이터 필드를 가질 것입니다. 그래서 세 개의 열이 아니라 두 개의 열. (3) NULL NOT 표 Benodigdheid (IDbenodigdheid INT (3) AUTO_INCREMENT NOT NULL, ID의 INT, NULL NOT VARCHAR benodigdheden (35), PRIMARY KEY를 CREATE (IDbenodigdheid, benodigdheden), : –

+0

나는로 변경 외래 키 (ID) 참조 Gerecht (ID) ); 하지만 여전히 같은 오류가 발생합니다. – sophie

0

Benodigdheid 테이블에 대한 제약 조건을 키 ID에서 Gerecht의 기본 키 ID로 설정했습니다. 별도의 외래 키가 필요합니다. 기본 키와 외래 키를 같은 열로 사용할 수 없습니다. 단어를 이해할 수 없어서 무엇이 적합한지 모르지만 제약 조건이 문제이며 오류가 발생합니다.

+0

실제로 기술적으로 동일한 컬럼에 기본 키와 외래 키가있을 수 있습니다. 실제로 잘못된 스키마를 가리킬 수 있습니다. 감각. –

+0

그냥 명확히하기 위해'benodigdheid = requisite'와'gerecht = dish' –

+0

답장을 주셔서 감사합니다. 무엇보다도 : Benodigdheid = 주방 용품, Gerecht = 요리, gerechtnaam = 요리 이름, Eenheid = 단위. Gerecht의 신분증은 Benodigdheid의 ID와 동일해야합니다 (부엌 공급이 필요한 요리를 아는 방법). 따라서 참조 키는 ID 여야합니다. 그리고 나는 또한 기본 키를 변경할 수 없다고 생각합니다. 그래서 무엇을 제안합니까? – sophie