Minha sugestão é, crie o genérico
id
coluna com auto_increment primeiro, para ter uma chave primária na tabela. Em seguida, crie uma chave exclusiva para recipeId
e stepNumber
juntos para que você não tenha nenhuma combinação duplicada desses 2 campos. Para poder adicionar várias etapas para uma única receita, você precisará garantir que nenhuma das
recipeId
, stepNumber
ou instruction
está definido para incremento automático. A única coluna definida como auto_increment permanece id
. Assim, o esquema da tabela para essas 2 tabelas seria semelhante (ignore a
category
coluna) 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;
Vamos adicionar um registro no
recipies
mesa primeiro INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Então vamos adicionar uma linha
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 após
SELECT
e 1 emWHERE
condição ambos se referem à linha comid=1
nasrecipies
tabela IFNULL(MAX(stepNumber),0)+1
selecionará o número de etapa mais alto para essa receita (se não existir, selecionará "0") +1
Aqui está um violino SQL se você quiser vê-lo funcionando.
[EDITAR]
Eu nunca precisei usar um combo para a chave primária, mas aparentemente seguindo funciona no InnoDB, desde que você ainda não tenha uma chave primária na tabela.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)