2015-09-13 16 views
5

Làm cách nào để đặt AUTO_INCREMENT trên CREATE TABLE hoặc ALTER TABLE từ một bảng khác?Cách đặt AUTO_INCREMENT từ một bảng khác

Tôi tìm thấy câu hỏi này, nhưng không được giải quyết vấn đề của tôi: How to Reset an MySQL AutoIncrement using a MAX value from another table?

Tôi cũng đã cố gắng này:

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

này:

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

này:

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

và điều này:

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

Tôi nghĩ rằng bạn cần phải sử dụng SQL động cho việc này. –

+0

Bạn có thể cho tôi một ví dụ không? – Codename

+0

Tại sao câu trả lời được chấp nhận cho câu hỏi được liên kết giải quyết vấn đề của bạn? –

Trả lời

4

Mã này sẽ tạo thủ tục dành cho bạn:

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; 

Sau đó, bạn có thể gọi CALL tbl_wth_ai(2); đi qua các tham số bên trong dấu ngoặc đơn.

Ví dụ:

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

Cảm ơn, nhưng tôi nhận được thông báo lỗi này: 'ERROR 1064 (42000) ở dòng 1: Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để có cú pháp đúng để sử dụng gần '' tại dòng 4' – Codename

+0

@Codename - Tôi đoán bạn không thay đổi deliminter. Đây có phải là lý do tại sao bạn không xem xét các câu trả lời bạn đã liên kết không? –

+0

@ ÁlvaroG.Vicario: Loại deliminter nào bạn muốn nói, ''...''? Tôi cũng đã thử nó với '" ... "' – Codename

0

này hoạt động tốt:

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

Cảm ơn bạn đã trích đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp tức thì, có giới hạn. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị lâu dài của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ làm cho nó hữu ích hơn cho người đọc trong tương lai các câu hỏi tương tự khác. Vui lòng [sửa] câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện. –

Các vấn đề liên quan