Moja sugestia brzmi:utwórz ogólny id
kolumna z auto_increment jako pierwsza, aby mieć klucz podstawowy w tabeli. Następnie utwórz unikalny klucz dla obu recipeId
i stepNumber
razem, więc nie będziesz mieć zduplikowanej kombinacji tych 2 pól.
Aby móc dodać wiele kroków dla jednego przepisu, musisz upewnić się, że żaden z recipeId
, stepNumber
lub instruction
jest ustawiony na automatyczne zwiększanie. Jedyna kolumna ustawiona na auto_increment pozostaje id
.
Tak więc schemat tabeli dla tych 2 tabel będzie wyglądał następująco (zignoruj category
kolumna)
CREATE TABLE `recipies` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '',
`category` enum('Salad','Dessert','Meat','Pastry') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `instructions` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`recipeId` int(11) unsigned NOT NULL,
`stepNumber` int(11) NOT NULL DEFAULT '1',
`instruction` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `recipeId` (`recipeId`,`stepNumber`),
CONSTRAINT `instructions_ibfk_1` FOREIGN KEY (`recipeId`) REFERENCES `recipies` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Dodajmy rekord w recipies
najpierw tabela
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Następnie dodajmy wiersz
INSERT INTO `instructions` (`recipeId`,`instruction`,`stepNumber`)
SELECT
1,
'You will need plenty of pumpkins!',
IFNULL(MAX(`stepNumber`),0)+1
FROM `instructions`
WHERE `recipeId`=1
- 1 po
SELECT
i 1 wWHERE
warunek oba odnoszą się do wiersza zid=1
wrecipies
stół IFNULL(MAX(stepNumber),0)+1
wybierze najwyższy numer kroku dla tego przepisu (jeśli nie istnieje, wybierze „0”) +1
Oto skrzypce SQL jeśli chcesz zobaczyć, jak działa.
[EDYTUJ]
Nigdy nie musiałem używać kombinacji dla klucza podstawowego, ale najwyraźniej następujące prace na InnoDB pod warunkiem, że nie masz już klucza podstawowego w tabeli.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)