Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

तालिका में auto_increment के साथ 2-फ़ील्ड प्राथमिक कुंजी नहीं हो सकती है

मेरा सुझाव है, जेनेरिक 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 के बाद और 1 WHERE . में हालत दोनों id=1 . के साथ पंक्ति को संदर्भित करते हैं recipies . में टेबल
  • IFNULL(MAX(stepNumber),0)+1 उस नुस्खा के लिए उच्चतम चरण संख्या का चयन करेगा (यदि यह मौजूद नहीं है तो यह "0" का चयन करेगा) +1

यह रहा एक SQL fiddle अगर आप इसे काम करते हुए देखना चाहते हैं।

[संपादित करें]
मुझे प्राथमिक कुंजी के लिए कॉम्बो का उपयोग करने की आवश्यकता नहीं है, लेकिन स्पष्ट रूप से InnoDB पर निम्नलिखित कार्य करता है बशर्ते आपके पास तालिका में पहले से प्राथमिक कुंजी न हो।

ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UNION और ORDER BY के साथ अजीब परिणाम

  2. xampp के साथ उबंटू के भीतर mysql डेटाबेस में ज़ोन टेबल कैसे पॉप्युलेट करें?

  3. कैसे जांचें कि MySQL में दो दिनांक सीमाएं ओवरलैप हैं या नहीं?

  4. MYSQL का उपयोग करके डेटाबेस में h:mm pm/am समय प्रारूप डालें

  5. तीन के साथ क्वेरी का चयन करें जहां स्थितियां धीमी हैं, लेकिन एक ही क्वेरी तीन में से दो के संयोजन के साथ जहां स्थितियां तेज हैं