2010-03-09 10 views
25

मुझे पता है कि यह काम नहीं करेगा, इसे विभिन्न रूपों में आजमाया और हर बार विफल रहा। निम्नलिखित परिणाम प्राप्त करने का सबसे आसान तरीका क्या है?किसी अन्य तालिका से MAX मान का उपयोग करके एक MySQL AutoIncrement को रीसेट कैसे करें?

ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC); 

यह स्वचालन परियोजनाओं के लिए बहुत अच्छा है। धन्यवाद!

SELECT @max := (max(ID)+1) from ABC;  -> This works! 
select ID from ABC where ID = (@max-1);  -> This works! 
ALTER TABLE XYZ AUTO_INCREMENT = (@max+1); -> This fails :(Why? 

उत्तर

28

उपयोग एक Prepared Statement:

SELECT @max := MAX(ID)+ 1 FROM ABC; 

    PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?'; 
    EXECUTE stmt USING @max; 

    DEALLOCATE PREPARE stmt; 
+0

मेरे प्रश्न के लिए एक सुंदर ठोस जवाब की तरह लगता है! धन्यवाद! – ThinkCode

+9

'ऑब्जेक्ट टैबलेट XYZ AUTO_INCREMENT =' ' मेरे लिए त्रुटि उत्पन्न करें :( – bor

+0

@ T30 आपकी त्रुटि क्या है? – Beetle

1

व्यक्तिगत तौर पर मैं शायद 2 प्रश्नों में यह करने के लिए या तो एक खोल स्क्रिप्ट या एक छोटे से सी #/C++ अनुप्रयोग या PHP/रूबी/पर्ल स्क्रिप्ट का उपयोग करेंगे:

  • ले लो मूल्य आप SELECT MAX(ID) FROM ABC; चाहते
  • जाहिर मूल्य ALTER TABLE XYZ AUTO_INCREMENT = <insert value retrieved from first query here>

उपयोग करते समय सावधानी कि नए ऑटो वेतन वृद्धि मौजूद डेटा के साथ किसी भी कुंजी संघर्ष का कारण नहीं बनेगा जा रहा है तालिका में परिवर्तन XYZ तालिका में।

+0

मैंने सोचा कि यह केवल MySQL क्वेरीज़ का उपयोग कर आसानी से किया जा सकता है। ऐसा लगता है कि मैं भाग्य से बाहर हूं। MySQL का उपयोग कर कोई अन्य समाधान - MySQL में चर का उपयोग कर? मैं शैल स्क्रिप्ट और पर्ल/पायथन स्क्रिप्ट के बजाय एक .sql फ़ाइल में क्वेरी का एक गुच्छा निष्पादित करना चाहता हूं। उत्तर के लिए धन्यवाद। – ThinkCode

2

ठीक है दोस्तों। मैं एक सहज ज्ञान युक्त समाधान के साथ आया हूँ। सबसे अच्छा हिस्सा यह है कि यह काम करता है!

SELECT @max := max(ID) from ABC;  
ALTER TABLE XYZ AUTO_INCREMENT = 1; 
ALTER TABLE XYZ ADD column ID INTEGER primary key auto_increment; 
UPDATE XYZ SET ContactID = (ContactID + @max); 
+0

संपर्क आईडी कहां से आता है? – T30

0

तुम सच में अकेले MySQL में ऐसा करना चाहते हैं, तो आप बस गतिशील बनाया बदलने आदेश डिस्क पर एक फ़ाइल में डंप कर सकते हैं और फिर इसे निष्पादित।

तो जैसा

:

select concat('ALTER TABLE XYZ AUTO_INCREMENT = ',max(ID)+1,';') as alter_stmt 
into outfile '/tmp/alter_xyz_auto_increment.sql' 
from ABC; 

\. /tmp/alter_xyz_auto_increment.sql 
+0

उत्तर के लिए धन्यवाद। यह एक दिलचस्प समाधान है! मेरी स्थिति के लिए एक लिल 'अतिरिक्त काम हो सकता है। – ThinkCode

5

मैं अपने आवेदन का एक नया संस्करण के लिए एक स्वचालित डेटाबेस परिवर्तन स्क्रिप्ट बना रहा हूं।

एक तालिका में, मुझे प्राथमिक ऑटो-वृद्धि फ़ील्ड को एक अलग क्षेत्र में बदलने की आवश्यकता थी। '= ALTER तालिका XYZ AUTO_INCREMENT?'

-- Build a new ID field from entry_id, make it primary and fix the auto_increment for it: 
ALTER TABLE `entries` ADD `id` INT UNSIGNED NOT NULL FIRST; 
UPDATE entries SET id = entry_id; 
ALTER TABLE `entries` ADD PRIMARY KEY ( `id`); 

-- ...the tricky part of it: 
select @ai := (select max(entry_id)+1 from entries); 
set @qry = concat('alter table entries auto_increment=',@ai); 
prepare stmt from @qry; execute stmt; 

-- ...And now it's possible to switch on the auto_increment: 
ALTER TABLE `entries` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 
+0

यह वास्तव में मेरे में काम करता है ql 5.5 – shigeta

7

कौन साथ समस्या हो रही है से stmt तैयार: चूंकि यह पेज जबकि मैं इसके लिए एक समाधान googled पहले कई बार आया था, यहाँ एक समाधान है कि अंततः मेरे लिए काम किया है

CREATE PROCEDURE reset_xyz_autoincrement 
BEGIN 
     SELECT @max := MAX(ID)+ 1 FROM ABC; 
     set @alter_statement = concat('ALTER TABLE temp_job_version AUTO_INCREMENT = ', @max); 
     PREPARE stmt FROM @alter_statement; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
END 
+0

मुझे इस के लिए उच्च उम्मीद थी, लेकिन मुझे यह त्रुटि मिलती है: # 1064 - आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; 'SELECT @max: = MAX (id) + 1 परीक्षण से' लाइन 2 पर उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके मारियाडीबी सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें – kloddant

3

ऑटो वृद्धि आईडी रीसेट कर सकते हैं।

http://community.spiceworks.com/scripts/show/3042-reset-auto-increment-ids

अद्यतन छोटी संभव डेटाबेस में वर्तमान मूल्यों पर आधारित मूल्य के लिए एक डेटाबेस में सभी ऑटो वेतन वृद्धि कॉलम। डेटाबेस को साफ करने के बाद हमें ऐसा करने की ज़रूरत थी।

एक संग्रहीत प्रक्रिया के भीतर एक तैयार वक्तव्य का उपयोग करें:

drop PROCEDURE if exists reset_autoincrement; 
DELIMITER // 
CREATE PROCEDURE reset_autoincrement (IN schemaName varchar(255)) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE o_name VARCHAR(255); 
    DECLARE o_table VARCHAR(255); 
    DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.`COLUMNS` WHERE extra LIKE '%auto_increment%' and table_schema=schemaName; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cur1; 
    read_loop: LOOP 
    FETCH cur1 INTO o_name, o_table; 

    IF done THEN 
     LEAVE read_loop; 
    END IF; 

    set @qry1 = concat('SELECT MAX(`',o_name,'`) + 1 as autoincrement FROM `',o_table,'` INTO @ai'); 
    PREPARE stmt1 FROM @qry1; 
    EXECUTE stmt1; 

    IF @ai IS NOT NULL THEN 
     SELECT o_name, o_table; 
    select @qry1; 
    select @ai; 
    set @qry2 = concat('ALTER TABLE `',o_table,'` AUTO_INCREMENT = ', @ai); 
    select @qry2; 
    PREPARE stmt2 FROM @qry2; 
    EXECUTE stmt2; 
    END IF; 

    END LOOP; 

    CLOSE cur1; 
END // 
DELIMITER ; 


call reset_autoincrement('my_schema_name'); 
6

निम्नलिखित the mysql docs, इस mysql 5 में मेरे लिए काम किया।7:

SET @m = (SELECT MAX(id) + 1 FROM ABC); 
SET @s = CONCAT('ALTER TABLE XYZ AUTO_INCREMENT=', @m); 
PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 
0

मैं केवल एक शौकिया कर रहा हूँ, लेकिन आप नए डेटा के साथ अपने पूरे तालिका भरता है तो मैं एक टिप :-) है, तो आप सिर्फ भरने से पहले उपयोग कर सकते हैं:

mysql_query("TRUNCATE TABLE `your_table`") or die(mysql_error()); 

मेरा मतलब है, यह auto_increment को रीसेट करता है (और सभी सामग्री मिटा देता है; हाँ, तालिका रहेगी)।

संबंधित मुद्दे