다른 테이블의 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?
준비된 문을 사용합니다.
SELECT @max := MAX(ID)+ 1 FROM ABC;
PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
EXECUTE stmt USING @max;
DEALLOCATE PREPARE stmt;
MySQL 설명서에 따라 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;
'ALTER TABLE XYZ AUTO_INCREMENT = ?'의 준비 stmt에 문제가 있는 사용자는 다음을 사용할 수 있습니다.
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
새 버전의 응용 프로그램에 대한 자동 데이터베이스 변환 스크립트를 만들고 있습니다.
한 테이블에서 기본 자동 증분 필드를 다른 필드로 변경해야 했습니다.이 페이지는 제가 이에 대한 솔루션을 검색하는 동안 여러 번 처음으로 표시되었기 때문에, 다음과 같은 솔루션이 저에게 효과적이었습니다.
-- 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;
자동 증분 ID를 재설정합니다.
데이터베이스의 모든 자동 증분 열을 데이터베이스의 현재 값에 따라 가능한 가장 작은 값으로 업데이트합니다.데이터베이스를 정리한 후 이 작업을 수행해야 했습니다.
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');
개인적으로 셸 스크립트나 약간의 C#/C++ 애플리케이션 또는 PHP/Ruby/Perl 스크립트를 사용하여 다음 두 가지 쿼리를 수행할 것입니다.
- 원하는 가치 획득
SELECT MAX(ID) FROM ABC;
- 값을 사용하여 테이블 변경
ALTER TABLE XYZ AUTO_INCREMENT = <insert value retrieved from first query here>
새로운 자동 증분이 기존 데이터와 주요 충돌을 일으키지 않도록 주의해야 합니다.XYZ
테이블.
네, 여러분.저는 그렇게 직관적이지 않은 해결책을 생각해냈습니다.가장 좋은 점은 효과가 있다는 것입니다!
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);
MySQL에서만 이 작업을 수행하려면 동적으로 빌드된 alter 명령을 디스크의 파일에 덤프한 다음 실행하면 됩니다.
이와 같은 경우:
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
언급URL : https://stackoverflow.com/questions/2410689/how-can-i-reset-an-mysql-autoincrement-using-a-max-value-from-another-table
'programing' 카테고리의 다른 글
윈도우즈 7에서 명령줄별 SQL 파일 가져오기 (0) | 2023.09.05 |
---|---|
Objective-C 클래스에서 Swift 함수 (0) | 2023.09.05 |
jQuery 1div를 제외한 페이지의 아무 곳이나 클릭 (0) | 2023.09.05 |
Python + MariaDB skiping other 문 (0) | 2023.08.31 |
CSV를 가져올 때 행 수가 다름 (0) | 2023.08.31 |