मेरा सुझाव है, जेनेरिक id
create बनाएं तालिका में प्राथमिक कुंजी रखने के लिए पहले auto_increment वाला कॉलम। फिर recipeId
. दोनों के लिए एक अद्वितीय कुंजी बनाएं और stepNumber
एक साथ ताकि आपके पास इन 2 क्षेत्रों का कोई डुप्लिकेट संयोजन न हो।
एक ही रेसिपी के लिए कई चरण जोड़ने में सक्षम होने के लिए आपको यह सुनिश्चित करना होगा कि 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
- 1
SELECT
के बाद और 1WHERE
. में हालत दोनोंid=1
. के साथ पंक्ति को संदर्भित करते हैंrecipies
. में टेबल IFNULL(MAX(stepNumber),0)+1
उस नुस्खा के लिए उच्चतम चरण संख्या का चयन करेगा (यदि यह मौजूद नहीं है तो यह "0" का चयन करेगा) +1
यह रहा एक SQL fiddle अगर आप इसे काम करते हुए देखना चाहते हैं।
[संपादित करें]
मुझे प्राथमिक कुंजी के लिए कॉम्बो का उपयोग करने की आवश्यकता नहीं है, लेकिन स्पष्ट रूप से InnoDB पर निम्नलिखित कार्य करता है बशर्ते आपके पास तालिका में पहले से प्राथमिक कुंजी न हो।
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)