2012-07-25 3 views
7

테이블에서 값을 삽입 한 시점부터 오름차순으로 정렬하려면 어떻게해야합니까? timestamp 나 autoincrement와 같은 특별한 칼럼은 없습니다.MySQL, ORDER BY 삽입 순서, 정렬 열 없음

나는 이것이 권장되지 않는다는 것을 알고있다. 아직도 나는 이것을 어떻게하는지 알고 싶다.

답변에서 알 수 있듯이 값을 삽입하기 전에 timestamp 나 autoincremental과 같은 정렬 열을 추가하지 않으면 삽입을 통해 정렬 할 방법이 없습니다.

답변

7

쿼리에 ORDER BY 절이없는 특정 순서로 행이 반환된다는 보장은 없습니다.

테이블의 모든 행의 모든 ​​열을 반환하는 간단한 쿼리의 경우 ... 예 : 이러한 쿼리

SELECT * FROM mytable ; 

, MySQL이 테이블의 처음부터, 전체 테이블 스캔을 수행 할 것 같다, 그래서 행들은 물리적 스토리지에서 발견되는 순서로 반환 될 가능성이 높습니다.

삭제, 갱신 및 재구성이없는 경우 행이 삽입 된 순서와 대략적으로 일치 할 수 있습니다. 삽입 된 행의 공간이 나중에 다시 계산되어 새로 삽입 된 행을 저장하기 위해 재사용됩니다.

그러나이 동작은 보장되지 않습니다. 행이 삽입 된 순서로 리턴하려면 행의 C 럼 내에 저장된 정보 (행이 삽입 된 순서)가 실제로 필요합니다.

+0

좋은 답변입니다. 예,이 동작은 보장 할 수 없으므로 삽입 시점에 따라 해당 순서가 지정되지 않았기 때문에 알 수 있습니다. – jacktrades

+0

그러나 행이 삽입 될 때 내림차순으로 정렬하는 방법은 무엇입니까? –

+1

@Bhavesh Gangani : 예, 행을 특정 시퀀스에 삽입 할 수 있습니다. 그러나 그것은 SELECT 문이'ORDER BY' 절에 지정된 순서를 제외하고 행이 삽입 된 순서대로 또는 특정 순서로 행을 반환한다는 것을 보장하지 않습니다. 삽입 된 순서대로 행을 반환해야하는 경우 각 행에 해당 정보를 사용할 수 있어야합니다. 대개 행 자체에 저장되지만 가장자리 경우에는 각 행에 대해 파생 될 수있는 다른 테이블에 저장 될 수 있습니다. – spencer7593

0

질의를 주문할 열이 있어야합니다. 일반적으로 삽입 타임 스탬프, 또는 ID/증분 키를 증가시킵니다. 기록이 없기 때문에 주문을 달리 보장 할 방법이 없습니다.

relevant thread from MySQL forum

+0

100 % MySQL이 삽입 시간이나 이와 비슷한 것을 기록하지 않았는지 100 % 확신 할 수 있습니까? – jacktrades

+0

왜 타임 스탬프 열을 추가하지 않는 것이 좋을까요? 그리고 네, 100 % 확신합니다. 질의를 주문하려면 * by *로 주문해야합니다. – Dima

+0

MySQL 포럼에서 읽으십시오. '일반적으로 주문을 지정하지 않은 경우 DB에서 반환하는 행의 순서에 의존해서는 안됩니다.'라는 메시지가 나타납니다. 확실하지 않습니다. – jacktrades

1

당신은 ORDER BY 뭔가 당신이 당신의 테이블에서 얻을 수 있습니다. 필요한 순서를 찾는 데 사용할 수있는 항목이 없으면 주문할 수 없습니다.

+0

100 % 정확합니까? – jacktrades

+2

음, 내가 틀린 것으로 알고있는 대답을 추가하는 것은 이상 할 것입니다. 지금은 그렇지 않습니까? 당신이 받아들이는 대답은 기본적으로 똑같습니다.하지만 어떻게 든 당신이 할 수있는 일을 암시하는 것처럼 보입니다. 주문할 수 없으면 주문할 수 없습니다. 나머지는 언급 할만한 가치가 없습니다 .. – Nanne

1

테이블의 데이터에 따라 데이터의 ID로 정렬 할 수 있습니다 (PK 고유성을 보장하기 위해 데이터에 단일 증분 정수가있는 경우). 데이터가 캡처되어 테이블에 기록되지 않는 한 게재 신청서를 정렬 할 수있는 다른 방법은 없습니다.

테이블 수준에서 지정하지 않은 레코드에 대한 여분의 (메타) 정보를 유지하는 MySQL에 대해서는 알지 못합니다.