MySQL

2013-02-12 26 views
6

में वर्ष और महीना सहित ऑटो वृद्धि, मेरे पास प्रोजेक्ट अनुमान बोली संख्या के लिए एक ऑटो वृद्धि क्षेत्र वाला प्रोजेक्ट है जिसे Project_ID कहा जाता है।MySQL

यह फ़ील्ड स्वतः बढ़ी है। मैंने इसे 8 अंकों के चरित्र क्षेत्र के रूप में बनाया है जो फ़ील्ड नियम रखता है।

मुझे दो महीने के रूप में ऑटो वृद्धि करने की आवश्यकता है, दो महीने के महीने में, एक हाइफ़न शामिल है, और उसके बाद उस समय की अवधि में पहले रिकॉर्ड के लिए पर शुरू होने वाली संख्या शामिल है।

अप्रैल 2012 की महीने के लिए एक उदाहरण 2 के लिए पहले रिकार्ड के लिए 1204-001, 1204-002 होगा और आदि तो जब मई के महीने PROJECT_ID आसपास रोल 1205- को बदल जाएगा 001।

इस प्रकार है क्या मैं लिखने की कोशिश कर रहा है, मैं

Cyear(date()) + (month()) + “-“ + “001” . 

का डिफ़ॉल्ट मान के साथ एक सरल डिफ़ॉल्ट अभिव्यक्ति के रूप में यह रखा मैं यह कैसे प्राप्त है?

+4

संग्रहीत प्रक्रिया, या प्रर्लिंग भाषा जैसे पर्ल, जावा या सी # में सम्मिलित करें। कम से कम, आपको 1) अधिकतम (Project_id) का चयन करना होगा, 2) निर्धारित करें कि यह वही है या एक अलग महीना/वर्ष है, 3) वर्ष और महीना कोड प्राप्त करें, 4) इंडेक्स की गणना करें (-001, - 002, आदि) और 5) परिणामी Project_id मान (इस रिकॉर्ड के साथ जाने वाले शेष फ़ील्ड के साथ) डालें। IMHO ... – paulsm4

+0

हां, इसकी अनुमति देने के लिए MySQL में कोई अंतर्निर्मित तंत्र नहीं है। अगली 'Project_ID' प्राप्त करने के लिए @ paulsm4 – Minesh

+0

संग्रहीत फ़ंक्शन का पालन करें। – SparKot

उत्तर

1

असल में, आप उस तालिका पर INSERTTRIGGER से पहले कॉलम को बढ़ाए जाने के लिए उपयोग कर सकते हैं।

// get current YEAR 
SET @cur_Year = CONCAT(DATE_FORMAT(CURDATE(), '%Y')); 
// get current MONTH 
SET @cur_MONTH = CONCAT(DATE_FORMAT(CURDATE(), '%m')); 
// concatenate YEAR and MONTH 
SET @Year_Month = CONCAT(@cur_Year, @cur_MONTH); 
// get the last value for the current YEAR and MONTH 
SET @max_ID = (SELECT MAX(ID) 
       FROM tableName 
       WHERE ID LIKE CONCAT(@Year_Month, '-%')); 
// get the last three characters from the id, convert in to 
// integer and increment by 1 
SET @last_ID = CAST(RIGHT(@max_ID, 3) AS SIGNED) + 1; 
// pad zero on the left using LPAD and 
// concatenate it with YEAR and MONTH 
SET @new_ID = CONCAT(@Year_Month,'-',LPAD(CAST(@last_ID AS CHAR(3)), 3, '0')); 
0
INSERT INTO (Project_ID, col1, col2, col3) 
SELECT DATE_FORMAT(NOW(), CONCAT('%y%m-', 
    (( SELECT RIGHT(CONCAT('000', (RIGHT(Project_ID, 3) + 1)), 3) AS number 
     FROM table_name 
     WHERE LEFT(Project_ID, 5) = DATE_FORMAT(NOW(), '%y%m-')) 
     ORDER BY Project_ID DESC 
     UNION 
    ( SELECT '001') 
     LIMIT 1))), 
'Col1 data', 'Col2 data', 'Col3 data' 

यह थोड़ा अजीब लग सकता है, तो मैं बस प्रवाह समझाएंगे::

यहाँ एक सरल एल्गोरिथ्म बना सकते हैं और ट्रिगर के अंदर इस कोड डाल करने के लिए कुछ कदम उठाए जाते हैं

मैं INSERT INTO ... SELECT का उपयोग करता हूं ताकि मैं table_name से मौजूदा डेटा देख सकूं ताकि यह देखने के लिए कि पहले से मौजूद कोई मौजूदा मामला है या नहीं। WHERE मौजूदा मामलों को मिलेगा, और RIGHT और LEFT दोनों के लिए धन्यवाद, आवश्यक प्रासंगिक डेटा तैयार करना बहुत मुश्किल नहीं है। यदि कोई पंक्ति नहीं मिलती है, तो '001' इसके बजाए उपयोग किया जाता है, तो आप दिखाए गए मौजूदा कॉलम को असाइन करते हैं।

1

मैं बिल्कुल यह समाधान कर लिया है, बस एक बार देख ले ..

सबसे पहले आप एक नमूना तालिका जहां स्तंभ project_id को छोड़कर अपने मूल तालिका के कॉलम को ही होगा लेना है।

तो पहले मूल तालिका में एक पंक्ति डालें जहां कॉलम project_id = 0 का मान और अन्य कॉलम शून्य हैं, बस इस तरह मैन्युअल रूप से पहली पंक्ति डालें।

फिर नमूना तालिका पर निम्न जैसे ट्रिगर बनाएं ...

//////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////

डिलीमीटर ;;

ट्रिगर टी try

प्रत्येक पंक्ति के लिए

पर डालने के बाद

शुरू

घोषित वी पूर्णांक बनाएँ;

सी int घोषित करें;

सेट v = (original से अधिकतम (project_id) का चयन करें);

अगर (v = 0) तो

डालने original सेट में

project_id = concat ((concat का चयन करें (सही (substring_index ((चयन * से (curdate() try सीमा 1) के रूप में से चयन ए), '-', '1'), 2), दाएं (substring_index ((से चुनें * (try सीमा 1 से curdate() का चयन करें), '-', '2'), 2) से try सीमा 1), '- 001'),

project = नया। project;

बाकी

सेट c = (सही का चयन करें ((original से अधिकतम (project_id)) एक्स के रूप में, 3) सीमा 1 original से चयन);

डालने में original सेट

project_id = concat ((concat का चयन करें (सही (substring_index ((चयन * से (एक के रूप में try सीमा 1) से curdate() का चयन करें), '-', '1') , 2), दाएं (substring_index ((से चुनें * (try सीमा 1 से curdate() का चयन करें), '-', '2'), 2)) try सीमा 1), concat ('- 00' , सी + 1)),

project = नया। project;

original सीमा 1 से हटाएं;

अंत यदि;

अंत ;;

//////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////

ऊपर ट्रिगर मेरी नमूना तालिका था try (project पाठ) और मूल तालिका था original (project_id पाठ, project में पाठ)

नमूना तालिका पर इस तरह एक ट्रिगर बनाने के बाद, नमूना तालिका में पंक्तियों को सम्मिलित करना शुरू करें, पंक्तियां स्वचालित रूप से project_id कॉलम जैसे ऑटो_इनक्रिकमेंट मानों के साथ मूल तालिका में डाली जाएंगी जैसे .1405-001,1405-002, 1405-003 .... 142014 और 05May है और बाकी ऑटो_इनक्रिकमेंटेड मान हैं जो ट्रिगर का उपयोग करके बढ़ रहे हैं।

बस उपरोक्त चरणों का पालन करें, आपकी समस्या निश्चित रूप से हल हो जाएगी।