Saran saya, buat id
generik kolom dengan auto_increment terlebih dahulu, untuk memiliki kunci utama dalam tabel. Kemudian buat kunci unik untuk keduanya recipeId
dan stepNumber
bersama-sama sehingga Anda tidak akan memiliki kombinasi duplikat dari 2 bidang ini.
Agar dapat menambahkan beberapa langkah untuk satu resep, Anda harus memastikan tidak ada recipeId
, stepNumber
atau instruction
diatur ke peningkatan otomatis. Satu-satunya kolom yang disetel ke peningkatan_otomatis tetap id
.
Jadi skema tabel untuk 2 tabel ini akan terlihat seperti (abaikan category
kolom)
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;
Mari tambahkan catatan di recipies
tabel dulu
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Lalu mari kita tambahkan satu baris
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 setelah
SELECT
dan 1 diWHERE
kondisi keduanya merujuk ke baris denganid=1
direcipies
meja IFNULL(MAX(stepNumber),0)+1
akan memilih nomor langkah tertinggi untuk resep itu (jika tidak ada akan memilih "0") +1
Berikut adalah biola SQL jika Anda ingin melihatnya bekerja.
[EDIT]
Saya tidak pernah perlu menggunakan kombo untuk kunci utama tetapi ternyata mengikuti bekerja di InnoDB asalkan Anda belum memiliki kunci utama dalam tabel.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)