私の提案は、id
最初にauto_incrementを使用して汎用列を作成し、テーブルに主キーを含めることです。次に、これら2つのフィールドの重複した組み合わせがないように、両方recipeId
と一緒に一意のキーを作成します。stepNumber
1つのレシピに複数のステップを追加できるようにするには、のいずれもrecipeId
、stepNumber
またはinstruction
自動インクリメントに設定されていないことを確認する必要があります。auto_incrementに設定された唯一の列は残りid
ます。
したがって、これら2つのテーブルのテーブルスキーマは次のようになります(category
列は無視してください)
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;
recipies
最初にテーブルにレコードを追加しましょう
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
次に、行を追加しましょう
INSERT INTO `instructions` (`recipeId`,`instruction`,`stepNumber`)
SELECT
1,
'You will need plenty of pumpkins!',
IFNULL(MAX(`stepNumber`),0)+1
FROM `instructions`
WHERE `recipeId`=1
- 後
SELECT
の1と条件の1は、どちらもテーブル内WHERE
の行を参照していますid=1
recipies
IFNULL(MAX(stepNumber),0)+1
そのレシピの最大のステップ番号を選択します(存在しない場合は「0」を選択します)+1
動作を確認したい場合は、SQLフィドルを使用してください。
[編集]
主キーにコンボを使用する必要はありませんでしたが、テーブルに主キーがない場合は、InnoDBで次のように動作するようです。
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)