कुछ उपसर्ग के साथ MySQL टेबल प्राथमिक कुंजी ऑटो वेतन वृद्धि कैसे करें


80

मेरे पास इस तरह की मेज है

table
id Varchar(45) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(30) NOT NULL,

मैं अपनी आईडी फील्ड को बढ़ाना चाहता हूं जैसे 'LHPL001','LHPL002','LHPL003'... आदि उसके लिए मुझे क्या करना चाहिए? कृपया मुझे कोई भी संभव तरीका बताएं।


बस ऐसा करने के लिए एक और कॉलम जोड़ें। डेटाबेस में ID फ़ील्ड के "विभिन्न प्रकार" होना पूरी तरह से सामान्य है।
फेटी

जवाबों:


135

यदि आपको वास्तव में इसकी आवश्यकता है, तो आप अनुक्रमण के लिए अलग तालिका (यदि आपको कोई आपत्ति नहीं है) और एक ट्रिगर की मदद से अपना लक्ष्य प्राप्त कर सकते हैं।

टेबल

CREATE TABLE table1_seq
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE table1
(
  id VARCHAR(7) NOT NULL PRIMARY KEY DEFAULT '0', name VARCHAR(30)
);

अब ट्रिगर

DELIMITER $$
CREATE TRIGGER tg_table1_insert
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq VALUES (NULL);
  SET NEW.id = CONCAT('LHPL', LPAD(LAST_INSERT_ID(), 3, '0'));
END$$
DELIMITER ;

तो आप बस तालिका 1 में पंक्तियाँ डालें

INSERT INTO Table1 (name) 
VALUES ('Jhon'), ('Mark');

और आपके पास होगा

| आईडी | NAME |
------------------
| LHPL001 | झोन |
| LHPL002 | मार्क |

यहाँ SQLFiddle डेमो है


ट्रिगर परमाणु के भीतर बयान है? यानी यह संभव है कि INSERT और SET के बीच एक और धागा / अनुरोध आवेषण तालिका 1_seq में हो जाए, जिससे LAST_INSERT_ID () अन्य अनुरोध की आईडी वापस कर सके और वह जो BEGA / END के भीतर डाला गया था नहीं।
n00b

@peterm, मेरे पास एक संदेह ट्रिगर भाग है। मैंने SET NEW.id = CONCAT ('A', LPAD (LAST_INSERT_ID) (), 4, '500') बदल दिया; क्योंकि मुझे 5001 से अपनी आईडी शुरू करने की आवश्यकता है इसलिए मैंने 500 सेट किए। इसलिए मुझे आउटपुट A5001 मिल रहा है जो सही है। मेरा शक एक बार आईडी ५ ९९ तक पहुंच गया तो अगली आईडी क्या होगी? क्या यह 6000 है?
user9437856

मैंने डेटाबेस में रिकॉर्ड जोड़ने के बाद अपने आप को आज़माया मैंने 1000 से अधिक रिकॉर्ड जोड़े और 5999 के बाद मेरा आईडी मान V1000 से शुरू होता है जो पूरी तरह से गलत है। मैं इसे 6000,6001,6002 और इतने पर जारी रखा जाना चाहिए। इसमें कोई विचार?
user9437856

18

एक सामान्य संख्यात्मक auto_increment ID के साथ एक तालिका बनाएँ, लेकिन या तो इसे परिभाषित करें ZEROFILL, या LPADचयन करते समय शून्य जोड़ने के लिए उपयोग करें। फिर CONCATअपने इच्छित व्यवहार को पाने के लिए मूल्य। उदाहरण 1:

create table so (
 id int(3) unsigned zerofill not null auto_increment primary key,
 name varchar(30) not null
);

insert into so set name = 'John';
insert into so set name = 'Mark';

select concat('LHPL', id) as id, name from so;
+---------+------+
| id      | name |
+---------+------+
| LHPL001 | John |
| LHPL002 | Mark |
+---------+------+

उदाहरण # 2:

create table so (
 id int unsigned not null auto_increment primary key,
 name varchar(30) not null
);

insert into so set name = 'John';
insert into so set name = 'Mark';

select concat('LHPL', LPAD(id, 3, 0)) as id, name from so;
+---------+------+
| id      | name |
+---------+------+
| LHPL001 | John |
| LHPL002 | Mark |
+---------+------+

शुरू में मैं LHPL को एक अलग कॉलम के रूप में संग्रहीत करने के बारे में सोच रहा था, फिर इसे concat (col1, col2) द्वारा संक्षिप्त करें, लेकिन तब S में दर्द होगा जब किसी दिन मुझे LHPL को बदलने की आवश्यकता होगी। इसलिए मुझे लगता है कि मैं इसे प्रोग्राम सर्वर साइड में करूंगा।
4 कवर

3

मुझे पता है कि यह देर हो चुकी है लेकिन मैं अभी इस पर साझा करना चाहता हूं कि मैंने इसके लिए क्या किया है। मुझे दूसरी तालिका जोड़ने या ट्रिगर करने की अनुमति नहीं है, इसलिए मुझे इसे सम्मिलित करने पर एक ही क्वेरी में उत्पन्न करना होगा। आपके मामले के लिए, क्या आप इस क्वेरी को आज़मा सकते हैं।

CREATE TABLE YOURTABLE(
IDNUMBER VARCHAR(7) NOT NULL PRIMARY KEY,
ENAME VARCHAR(30) not null
);

एक चयन करें और इस चयनित क्वेरी का उपयोग करें और पैरामीटर @IDNUMBER पर सहेजें

(SELECT IFNULL
     (CONCAT('LHPL',LPAD(
       (SUBSTRING_INDEX
        (MAX(`IDNUMBER`), 'LHPL',-1) + 1), 5, '0')), 'LHPL001')
    AS 'IDNUMBER' FROM YOURTABLE ORDER BY `IDNUMBER` ASC)

और फिर क्वेरी डालें:

INSERT INTO YOURTABLE(IDNUMBER, ENAME) VALUES 
(@IDNUMBER, 'EMPLOYEE NAME');

परिणाम अन्य उत्तर के समान होगा लेकिन अंतर यह है, आपको दूसरी तालिका बनाने या ट्रिगर करने की आवश्यकता नहीं होगी। मुझे उम्मीद है कि मैं किसी ऐसे व्यक्ति की मदद कर सकता हूं जिसके पास मेरा मामला है।


0

यहाँ पोस्टग्रेक्यूएल उदाहरण ट्रिगर के बिना है अगर किसी को पोस्टग्रेक्यूएल पर इसकी आवश्यकता है:

CREATE SEQUENCE messages_seq;

 CREATE TABLE IF NOT EXISTS messages (
    id CHAR(20) NOT NULL DEFAULT ('message_' || nextval('messages_seq')),
    name CHAR(30) NOT NULL,
);

ALTER SEQUENCE messages_seq OWNED BY messages.id;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.