2011-03-04 1 views
-1

이것은 MySQL의 질문입니다.mysql에서 위치 열을 다시 색인하기

다음 구조의 테이블이 있습니다.

reference 
position 
parent 

모든 항목은 위치가 있어야하며 각 위치는 한 번만 사용해야합니다. 위치가 증가해야합니다 (40 개의 항목이있는 경우 위치는 1-40에서 시작해야합니다).

그러나이 표의 데이터는 모든 곳에서 사용됩니다 (동일한 위치가 두 번 이상 사용되고 위치가없는 일부 행). 직책을 다시 색인화하여 표를 재설정하고 싶습니다. 나는 이것을 수행 할 때 기존 주문을 존중하고 싶다. (가능하다면 - 포지션을 폐기 할 수 없다면).

------------------------------------------------------ 
| reference  |  position  | parent  | 
|-----------------|--------------------|--------------| 
|ASHDFNS   |2     |89   | 
|BSHDFNS   |2     |89   | 
|CSHDFNS   |1     |89   | 
|DSHDFNS   |100     |89   | 
|ESHDFNS   |8     |89   | 
|FSHDFNS   |22     |89   | 
|ASHDFNS   |1     |11   | 
|BSHDFNS   |22     |11   | 
|CSHDFNS   |333     |11   | 
|-----------------|--------------------|--------------| 

원하는

------------------------------------------------------- 
| reference  |  position  | parent  | 
|-----------------|--------------------|--------------| 
|CSHDFNS   |1     |89   | 
|ASHDFNS   |2     |89   | 
|BSHDFNS   |3     |89   | 
|ESHDFNS   |4     |89   | 
|FSHDFNS   |5     |89   | 
|DSHDFNS   |6     |89   | 
|ASHDFNS   |1     |11   | 
|BSHDFNS   |2     |11   | 
|CSHDFNS   |3     |11   | 
|-----------------|--------------------|--------------| 

편집 : 죄송합니다, 단순히 자동 위치 테이블로 작동하지 않습니다 열 여러 부모 내에서 항목의 위치를 ​​설명를 증가 (및 항목이 하나 이상의 부모를 가질 수 있습니다)

+0

왜 이것을 원하니? 이 방법이 바람직 할 수있는 시나리오가 있습니다 (예를 들어, 하드 디스크가 연속적인 행에 대해 디스크에서 연속적인 sektor를 읽도록하는 등)하지만 매우 미세 최적화입니다. 좋은 색인은 당신을 위해 일의 99 %를 할 것이고, 테이블 주문은 그다지 중요하지 않습니다. – Konerak

+0

순서는 중요합니다. 이는 시스템 내에서 그 자체로 의미를 지닙니다. 내 질문을 수정하여 색인과 관련이없는 색인을 삭제했습니다. 감사합니다 – calumbrodie

+0

왜 downvote? – calumbrodie

답변

1

유사한 스키마를 가진 테이블을 만들지 만, auto_increment와 같은 열 위치를 만듭니다.

그 삽입 이후에 old_table 순서대로 삽입합니다. update and select the same table problem in mysql

또는이 - - Updating column so that it contains the row position

u는 그 후에, 위치 이런

을 나타내는 사용자 변수를 정의 그렇지

을 OLD_TABLE하는 NEW_TABLE 이름 바꾸기 OLD_TABLE 이름 바꾸기

insert into new_table select reference, 0, parent from old_table 
order by if (position is null, 99999, position); 

원하는

+0

답변을 주셔서 감사합니다 - 제가 제시 한 예에서 효과가있을 것입니다.하지만 제가 실행할 수있는 진술을 찾고있었습니다. 내 경우에는 이것이 작동하지 않는다는 것을 의미하는 추가적인 복잡성이 있습니다. 원래의 질문에 이것을 포함시키지 않아서 죄송합니다 - 지금 더 잘 설명하기 위해 편집하겠습니다 – calumbrodie

+0

당신의 repsonse 주셔서 감사합니다 – calumbrodie