Я сделал базу данных рецептов, она состоит из; название рецепта, идентификационный номер, ингредиенты, подготовка, изображение и т. д.
После этого я создал скрипт php и html, чтобы можно было искать в данных (например: ужин с подготовкой менее 45 минут).
Нет, я работаю над сценарием php для вставки новых рецептов. Я могу вставить $ sql1. Но когда я пытаюсь вставить $ sql2, он говорит:
Не удалось ввести данные Retval 2: Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (recepten
,benodigdheid
, ОГРАНИЧЕНИЕ benodigdheid_ibfk_1
ИНОСТРАННЫЙ КЛЮЧ (ID
) РЕКОМЕНДАЦИИ gerecht
(ID
))
Я понимаю, что проблема связана с отношением ребенок / родитель и внешним ключом, но я не могу найти проблему. Вам сначала нужно добавить данные в «Ингредиент»? Или сначала в «Герехте»?
Ниже я записал часть сценария, я могу дать больше, если потребуется.
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";
Создать базу данных скриптов:
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)
);
Вы не пытаетесь вставить идентификатор Gerecht
при вставке в Benodigheid
, Вы ДОЛЖНЫ также вставить это значение, поскольку в таблице есть ограничение ссылочной целостности. После первой вставки SQL необходимо прочитать идентификатор последней вставленной Gerecht
запись (возможно, с помощью mysqli_insert_id()
а затем добавить это значение идентификатора в вставке в Benodigheid
Таблица. Так $sql2
должен выглядеть так:
$sql2="INSERT INTO Benodigdheid (ID, benodigdheden)
VALUES ($id_from_sql1, '$benodigdheden')";
Ваш Benodigdheid
Таблица также кажется ошибочной в том, что она должна иметь свой собственный первичный ключ автоинкремента, а также ссылку на внешний ключ Gerecht
, Хотя, глядя на то, что вы делаете, кажется, что между отношениями 1: 1 Gerecht
а также Benodigheid
так что я на самом деле не знаю, почему у вас не было бы просто benogdigheid
как столбец на Gerecht
если это ваше намерение.
В целом, просматривая вашу схему, мне кажется, что вам нужно попрактиковаться в добавлении первичных ключей автоинкремента к вашим таблицам (что обычно делается для большинства всех таблиц реляционных БД). Вы будете иметь ту же проблему на вашем ingredient
таблицы
Вы установили ограничение для таблицы Benodigdheid от ее идентификатора ключа до идентификатора первичного ключа в Gerecht. Вам нужен отдельный внешний ключ. Вы не можете иметь первичный ключ и внешний ключ в одном столбце.
Я не понимаю слов, поэтому не знаю точно, что и к чему, но это ограничение является проблемой и дает вам ошибку.