2016-08-09 5 views
0

3 개의 열과 100 개 이상의 항목/행이있는 기존 SQL 테이블이 있습니다. autoincrement가있는 id 열이 있습니다.SQL 테이블 - 이전 자동 증가 열의 시작 부분에 행을 추가하는 방법

이제 테이블의 시작 부분에 1에서 10까지의 ID를 가진 10 개의 새 행을 추가하려고합니다. 그러나 기존 행을 잃을 수는 없습니다. 그래서, 어떻게해야합니까?

방금 ​​전에 생각해 보았던 아이디어는 10을 더하면 기존의 ID를 11만큼 증가시킬 수 있고, 25는 10이 35가되고, 처음에는 행을 추가 할 수 있습니다. 가능한 경우이 스크립트의 스크립트는 무엇입니까?

+3

자동 증가 값을 무시하지 마십시오. 주문이 필요한 경우 다른 열을 사용하십시오! –

+0

하지만, 나는 노력했고, 효과가 있었다. UPDATE'table' SET'id' ='id' + 10 – dngs

+1

'1에서 10까지의 ID를 가진 테이블의 시작 부분에 10 개의 새로운 행을 추가하고 싶습니다. '- 아니, 실제로는 원하지 않습니다. 나는 네가 그렇게 생각한다고 생각하지만 너는 그렇게하지 않는다. 모든 것이 가능하며 나는 개인적으로이 잔인 함을 저지르는 코드를 제공하지 않습니다.당신이 쓴 해결책은'auto_increment'를 망치는 것을 잊어 버리고,'order_id'라고 부르는 다른 컬럼을 생성하고, 인덱스를 작성한 다음, 그 컬럼을 사용하여 * retrieve * 할 때 당신의 행을 정렬 할 것입니다. 지금, 당신은 나의 충고를 받아 들일 수있다, 또는, 당신이 가질 수있다, 오, 그렇게 auto_increment가 당신을 물면 재미있다. 그리고 그렇게 될 것입니다. –

답변

0

당신이해야 할 일은 그 테이블에 대한 auto_increment를 삽입하고자하는 새로운 레코드를위한 공간을 만드는 데 필요한 숫자로 설정하는 것입니다. 당신이 ID의 1-100에 행을 삽입 한 경우 예를 들어

, 당신은 수 있습니다

select auto_increment as val from information_schema.tables where table_schema='myschema' and table_name='mytable'; 

는 (값의 그 값이 101이 될 것이라고 가정하자 그 : 실행하여

확인 다음 AUTO_INCREMENT 값을 새 행을 삽입 한 경우 사용됩니다). 실행하여 수행 할 수 있습니다 "사전"는 AUTO_INCREMENT 값 :

alter table myschema.mytable auto_increment = 111; 

이 같은 새 행 삽입하는 경우 :

insert into mytable (not_the_id_column) values ('test'); 

그것은 (111)의 "다음"ID를 얻을하지만 것이다 당신은 ID를 지정하는 경우

insert into mytable (id, not_the_id_column) values (101, 'test101'); 
insert into mytable (id, not_the_id_column) values (102, 'test102'); 
... -- more inserts as needed 

를 PK 값을 업데이트 할 때 지금, 당신은 여전히 ​​적절한 예방 조치를 취해야합니다 값은 수동으로, 당신은 당신이 이런 식으로 원하는 레코드를 삽입 할 수 있도록, 111보다 작은 값 사용하는만큼이 경우에 확인됩니다 , 또는 종속성이있는 값 (외래 키 또는 기타)이지만 결과 auto_increment 값이 이미 테이블에있는 값과 중복되지 않는 한 id 값을 강제로 증가 및/또는 백필하는 것은 완전히 합법적입니다.

+0

나는 뭔가를 놓쳐 버렸을 것입니다. 어떻게 대답합니까? – Uueerdo

+0

@Uueerdo OP는 id (autoincrement 열)가 자동 증가로 생성 된 기존 데이터 나 미래 값을 간섭하지 않는 값으로 끝나는 10 개의 새로운 행을 삽입하려고합니다. 이 대답은 지나치게 구체화 된 구현 세부 정보를 지정하지 않고 MySql의 auto_increment 설정을 사용하여 다양한 문제를 해결할 수있는 다양한 방법을 보여줍니다 (예 : 명시 적으로 설정된 id 값 *은 1-10 일 수 있지만 반드시 그런 것은 아닙니다). – SlimsGhost

-2

나는 이것을하지 말아야한다는 Juergen d' s 의견에 동의하지만, 이런 종류의 일을해야하는 상황이 있음을 알고 있습니다.

SELECT MAX(id)-MIN(id)+1 INTO @x FROM theTable; 
UPDATE theTable SET id = id + @x; 
SELECT MIN(id) INTO @x FROM theTable; 
UPDATE theTable SET id = 10 + id - @x; 

id가 기본 키인 경우 업데이트 내의 값 충돌로 인해 MySQL에서 업데이트를 거부 할 수 있습니다. (따라서 이러한 가능성을 피하기 위해 한 쌍의 업데이트가 필요합니다.)

편집 : NB의 강력한 반대 의견을 고려하면 테이블의 다음 자동 증가 값이 충돌 가능성을 확인하는 것이 좋습니다. 업데이트가 완료된 후 업데이트 된 레코드 UPDATE 문이 영향을 미치는지 확인하기 위해 적절한 데이터베이스가 없습니다. 그들이 영향을 미치더라도 불필요한 간격을 만들지 않도록 끝내기를 원할 수도 있습니다. (틈새가 이상적으로 문제가되지 않아야합니다. 그러나 그것이 아니면 경미한 강박 장애 (OCD) 일뿐입니다.) .

+1

당신이 이것을해야만하는 유일한 상황은 일주일 전에 프로그래밍을 배우기 시작한 때이고 'auto_increment'가 순차적 번호를 산출한다고 거짓으로 가정했을 때입니다. 이 잔학 행위에 대한 해결책을 제공한다고해서 사람들이 일을 올바르게하는 법을 배울 수는 없으며, 단지 게으르게 만들 것이고,이 해결책을 붙여 넣을 수 있습니다. 그리고 모든 지옥이 풀리면 그들은 프로젝트를 포기할 것입니다. 신중하게 자신의 지식을 전파하는 방법에주의를 기울여야합니다. 몇 가지 인터넷 포인트는 피해가 발생할만한 가치가 없습니다. –

+0

@ N.B. 여러분이 시작하지 않은 장기 프로젝트를 물려 받으면, 그것은 순차적 인 순서로 ID의 존재를 의지하며, 많은 시스템이 단지 현재의 상태를 처리 할 수 ​​없기 때문에 데이터를 삽입해야한다는 것을 알게되고, 원칙적으로 도움을 거부하는 다른 사람들 (그리고 실제로 코드의 가치를 재 작성하라는 제안) 실제로는 ... 잘 ... 도움이되지 않습니다. ... 그리고 어떤 상황에서 MySQL은 auto_increments를 순서대로 발행하지 않는 것을 보았습니까? – Uueerdo

+1

잘못된 방법으로'auto_increment'를 사용하는 프로젝트를 상속했다면 수정하고 수정하는 것은 간단합니다. 순서대로 작동하는 컬럼을 추가하십시오. 내가 어떻게 알아? 지금까지 지난 15 년 동안 저는이 일을하고 있습니다. 저는 수백 개의 프로젝트를보고 고쳤습니다. 변명의 여지가 없습니다. 당신이 전문가인데, 자신이하는 일을하기 위해 돈을 받고 그와 비슷한 것을 보게된다면 그것은 고용주가 기술 부채에 직면하게 될 것이고 이는 결국 궁극적으로 돈을 잃을 것임을 의미합니다. 문제를 해결하는 것은 귀하의 책임입니다. –