2015-09-13 12 views
5

Wie kann ich die AUTO_INCREMENT auf CREATE TABLE oder ALTER TABLE aus einer anderen Tabelle setzen?Wie setze ich AUTO_INCREMENT von einer anderen Tabelle

fand ich diese Frage, aber mein Problem nicht gelöst: How to Reset an MySQL AutoIncrement using a MAX value from another table?

Ich habe auch versucht dies:

CREATE TABLE IF NOT EXISTS `table_name` (
    `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT, 
    `columnOne` tinyint(1) NOT NULL, 
    `columnTwo` int(12) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=(SELECT `AUTO_INCREMENT` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = 'database_name' AND `TABLE_NAME` = 'another_table_name'); 

dies:

ALTER TABLE `table_name` AUTO_INCREMENT=(SELECT `AUTO_INCREMENT` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = 'database_name' AND `TABLE_NAME` = 'another_table_name'); 

dies:

CREATE TABLE IF NOT EXISTS `table_name` (
    `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT, 
    `columnOne` tinyint(1) NOT NULL, 
    `columnTwo` int(12) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=(SELECT (MAX(`id`)+1) FROM `another_table_name`); 

und diese:

ALTER TABLE `table_name` AUTO_INCREMENT=(SELECT (MAX(`id`)+1) FROM `another_table_name`); 
+0

Ich glaube, Sie dynamische SQL für diese verwenden müssen. –

+0

Können Sie mir ein Beispiel geben? – Codename

+0

Warum hat die akzeptierte Antwort auf die verknüpfte Frage Ihr Problem nicht gelöst? –

Antwort

4

Dieser Code Prozedur für Sie erstellen:

CREATE PROCEDURE `tbl_wth_ai`(IN `ai_to_start` INT) 
BEGIN 

SET @s=CONCAT('CREATE TABLE IF NOT EXISTS `table_name` (
    `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT, 
    `columnOne` tinyint(1) NOT NULL, 
    `columnTwo` int(12) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = ', `ai_to_start`); 

    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END; 

Dann können Sie CALL tbl_wth_ai(2); Passieren der Parameter in den Klammern bezeichnen.

Zum Beispiel:

CALL tbl_wth_ai((SELECT id FROM `ttest` WHERE c1='b')); 
+0

Danke, aber ich bekomme diese Fehlermeldung: 'ERROR 1064 (42000) in Zeile 1: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, um die richtige Syntax in der Nähe von '' in Zeile 4 'zu verwenden. – Codename

+0

@Codename - Ich nehme an, dass Sie den Begrenzer nicht ändern. Ist das der Grund, warum du die Antworten, die du verlinkt hast, nicht berücksichtigt hast? –

+0

@ ÁlvaroG.Vicario: Welches Trennzeichen meinst du, "..."? Ich versuchte es auch mit '" ... "' – Codename

0

Dies funktioniert:

DELIMITER $$ 
CREATE PROCEDURE `tbl_wth_ai`(IN `ai_to_start` INT) 
BEGIN 

SET @s=CONCAT('CREATE TABLE IF NOT EXISTS `table_name` (
    `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT, 
    `columnOne` tinyint(1) NOT NULL, 
    `columnTwo` int(12) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = ', `ai_to_start`); 

    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END $$ 
DELIMITER ; 

CALL tbl_wth_ai((SELECT MAX(`id`)+1 FROM `another_table_name`)); 
DROP PROCEDURE IF EXISTS tbl_wth_ai; 
0
SELECT `AUTO_INCREMENT` INTO @AutoInc 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME = 'old_table'; 

SET @s:=CONCAT('ALTER TABLE `my_db`.`new_table` AUTO_INCREMENT=', @AutoInc); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

Vielen Dank für dieses Code-Snippet, das möglicherweise eine begrenzte, sofortige Hilfe bietet. Eine angemessene Erklärung [würde erheblich verbessern] (// meta.stackexchange.com/q/114762) ist ihr langfristiger Wert, indem sie zeigt * warum * das ist eine gute Lösung für das Problem, und würde es für zukünftige Leser mit mehr nützlich machen andere, ähnliche Fragen. Bitte [bearbeiten] Sie Ihre Antwort, um einige Erklärungen hinzuzufügen, einschließlich der Annahmen, die Sie getroffen haben. –