답변:
기본 키 열을 삭제하고 다시 만들 수 있습니다. 그런 다음 모든 ID를 순서대로 다시 할당해야합니다.
그러나 이것은 아마도 대부분의 상황에서 나쁜 생각입니다. 이 테이블에 외래 키가있는 다른 테이블이 있으면 작동하지 않습니다.
이 질문은 꽤 오래된 것 같지만 여기에서 검색하는 사람에 대한 답변을 게시합니다.
SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
열이 다른 테이블에서 외래 키로 사용되는 경우 해당 테이블 의 외래 키 관계에 대한 ON UPDATE CASCADE
기본값 대신 사용하십시오 ON UPDATE NO ACTION
.
또한 AUTO_INCREMENT
카운트 를 재설정하기 위해 다음 명령문을 즉시 발행 할 수 있습니다.
ALTER TABLE `users` AUTO_INCREMENT = 1;
MySQL의 경우 값을로 재설정합니다 MAX(id) + 1
.
.
id` = @count : = @count + 1 ''때문에 사전 정의 된 순서로 발생해야합니다 . 문서에서 : "오른쪽의 값은 리터럴 값, 값을 저장하는 다른 변수 또는 스칼라 값을 생성하는 모든 법적 표현
내 User 테이블의 ID를 재설정하기 위해 다음 SQL 쿼리를 사용합니다. 위에서 말하면 다른 테이블과의 관계를 망칠 것이라고합니다.
ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
이 쿼리를 간단히 사용할 수 있습니다
alter table abc auto_increment = 1;
해당 열의 기본 키 자동 증분 기능을 제거하고 해당 열을 업데이트 할 때마다 미리 쿼리를 실행하여 테이블의 모든 행을 계산 한 다음 해당 행 수를 반복하는 루프를 실행하여 각 값을 해당 행의 값에 총 행 수에 1을 더한 새 행을 삽입하는 쿼리를 실행하십시오. 이것은 완벽하게 작동하며 자신의 목표를 달성하려는 사람에게 가장 완벽한 솔루션입니다. 함수에 사용할 수있는 코드의 예는 다음과 같습니다.
$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("
SELECT `rank`, `field1`, `field2`, `field3`, `field4`
FROM (SELECT (@rank:=@rank+1) as `rank`, `field1`, `field2`, `field3`, `field4`
FROM (SELECT * FROM `views`) a
CROSS JOIN (SELECT @rank:=0) b
ORDER BY rank ASC) c
");
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
$data[] = $row;
}
foreach ($data as $row) {
$new_field_1 = (int)$row['rank'];
$old_field_1 = (int)$row['field1'];
mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");
여기에서는 select 쿼리 내에서 쿼리를 사용하여 순위 열에 추가 한 연관 배열을 만들었습니다.이 쿼리는 각 행에 1로 시작하는 순위 값을 부여했습니다. 그런 다음 연관 배열을 반복했습니다.
다른 옵션은 행 수를 얻고 기본 선택 쿼리를 실행하고 연관 배열을 가져 와서 동일한 방식으로 반복하지만 각 반복을 통해 업데이트되는 추가 변수를 사용하여 반복하는 것입니다. 이것은 유연성이 떨어지지 만 같은 일을 성취 할 것입니다.
$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("SELECT * FROM `table`");
$updated_key = 0;
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
$data[] = $row;
}
foreach ($data as $row) {
$updated_key = $updated_key + 1;
mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");
InnoDB의 경우 다음을 수행하십시오 (테이블에서 모든 레코드를 제거하고 bakcup을 먼저 만듭니다).
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 ;
/* ================================================= */
drop table tablename;
CREATE TABLE `tablename` (
table structure here!
) ENGINE=InnoDB AUTO_INCREMENT= ai number to reset DEFAULT CHARSET= char set here;
/* ================================================= */
SET SQL_MODE=@OLD_SQL_MODE ;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS ;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS ;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT ;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS ;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION ;
SET SQL_NOTES=@OLD_SQL_NOTES ;
나는 똑같은 의심을 가지고 있었지만 테이블을 변경할 수 없었습니다. 내 ID가 변수 @count에 설정된 최대 수를 초과하지 않는 것을 확인한 후 다음을 수행하기로 결정했습니다.
SET @count = 40000000;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
ALTER TABLE `users` AUTO_INCREMENT = 1;
해결책은 필요하지만 안전하고 테이블이 다른 테이블의 데이터와 함께 외래 키를 소유했기 때문에 필요했습니다.
내 의견은 row_order라는 새 열을 만드는 것입니다. 그런 다음 해당 열을 다시 정렬하십시오. 기본 키에 대한 변경 사항을 수락하지 않습니다. 예를 들어 주문 열이 banner_position 인 경우 배너 위치 열을 삭제, 업데이트, 생성하기위한 것입니다. 이 함수를 각각 재정렬하십시오.
public function updatePositions(){
$offers = Offer::select('banner_position')->orderBy('banner_position')->get();
$offersCount = Offer::max('banner_position');
$range = range(1, $offersCount);
$existingBannerPositions = [];
foreach($offers as $offer){
$existingBannerPositions[] = $offer->banner_position;
}
sort($existingBannerPositions);
foreach($existingBannerPositions as $key => $position){
$numbersLessThanPosition = range(1,$position);
$freshNumbersLessThanPosition = array_diff($numbersLessThanPosition, $existingBannerPositions);
if(count($freshNumbersLessThanPosition)>0) {
$existingBannerPositions[$key] = current($freshNumbersLessThanPosition);
Offer::where('banner_position',$position)->update(array('banner_position'=> current($freshNumbersLessThanPosition)));
}
}
}
이 작품 - https://stackoverflow.com/a/5437720/10219008.....but 당신이 문제에 대해 '오류 코드 : 1265 데이터 열에 대해 잘립니다'실행하면 '1 행에서'ID를 ... 그리고 실행 다음과 같은. 업데이트 쿼리에서 무시를 추가합니다.
SET @count = 0;
set sql_mode = 'STRICT_ALL_TABLES';
UPDATE IGNORE web_keyword SET id = @count := (@count+1);
숫자 ID를 기본 키로 사용하지 않아도됩니다. 테이블에 국가 정보가 포함 된 경우 국가 코드를 기본 ID로 사용하거나 기사를 보유하고있는 경우 영구 링크를 사용할 수 있습니다.
임의의 값 또는 MD5 값을 간단히 사용할 수도 있습니다. 이 모든 옵션에는 특히 IT 부서에서 고유 한 이점이 있습니다. 숫자 ID는 열거하기 쉽습니다.