2015-09-13 26 views
5

Come è possibile impostare AUTO_INCREMENT su CREATE TABLE o ALTER TABLE da un'altra tabella?Come impostare AUTO_INCREMENT da un'altra tabella

Ho trovato questa domanda, ma non ha risolto il mio problema: How to Reset an MySQL AutoIncrement using a MAX value from another table?

Ho provato anche questo:

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'); 

questo:

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

questo:

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`); 

e questo:

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

Credo che è necessario utilizzare SQL dinamico per questo. –

+0

Puoi farmi un esempio? – Codename

+0

Perché la risposta accettata alla domanda collegata non ha risolto il problema? –

risposta

4

Questo codice crea procedura per voi:

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; 

allora si può chiamare CALL tbl_wth_ai(2); passando il parametro all'interno delle parentesi.

Ad esempio:

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

Grazie, ma ottengo questo messaggio di errore: 'ERRORE 1064 (42000) alla riga 1: si è verificato un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a '' alla riga 4 ' – Codename

+0

@Codename - Immagino che tu non stia cambiando il delimitatore. È questo il motivo per cui non hai considerato le risposte che hai collegato? –

+0

@ ÁlvaroG.Vicario: quale delimitatore vuoi dire, '' ... ''? Ho anche provato con '" ... "' – Codename

0

Questo funziona bene:

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

Grazie per questo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –