복붙노트

[SQL] MySQL의에서 마지막 레코드를 얻기

SQL

MySQL의에서 마지막 레코드를 얻기

내가 MySQL을 사용하고 몇 가지 문제에 직면하고있다. 나는 삽입 된 마지막 행을 검색합니다.

<< >> 아래에 상세하다

아래는 내가 테이블을 생성하는 방법이다.

테이블 생성 maxID (MYID VARCHAR (4))

나는 아래로 네 개의 값을 삽입

insert into maxID values ('A001')
insert into maxID values ('A002')
insert into maxID values ('A004')
insert into maxID values ('A003')

내가 선택 MYID을 실행하면 maxID에서 NEWID로, 나는 다음과 같은 출력을 얻을 () LAST_INSERT_ID

myId NewID
A001   0  
A002   0  
A004   0  
A003   0    

내가 코드를 아래에 시도했을 때,

MYID을 선택 NEWID, @rowid ()를 LAST_INSERT_ID : maxID에서 myrow 같이 = @ ROWID + 1 (SELECT는 @rowid = 0)으로 초기화

나는 다음과 같은 출력을 얻을.

myId NewID  rowid
A001   0      1
A002   0      2
A004   0      3
A003   0      4

I는 MYID을 선택 코드를 사용하는 경우에는, NEWID, @rowid ()를 LAST_INSERT_ID : maxID에서 myrow 같이 = @ ROWID + 1 (SELECT는 @rowid = 0) INIT로 @rowid = 4, I는가 알 수없는 항목으로서 오류가 어디 WHERE 절에 myrow '

어디서 @ ROWID = 4, 나는 테이블에 데이터를 얻을하지 않습니다 사용할 때.

참고 : 여기 4 단지 원하는 얻을 수있는 출력을 사용하고 있습니다. 나중에 나는 (maxID에서 최대 (ROWID를 선택)) 쿼리에서이를 얻을 수 있습니다

난 단지 마지막 레코드 즉 A003을보고 싶은 경우에해야 할 일을 저를 제안하십시오.

시간 내 줘서 고마워.

해결법

  1. ==============================

    1.SELECT가 (물론, ORDER BY 절을 사용하지 않고) 특정 순서로 행을 반환 보장되지 않는 것 같습니다.

    SELECT가 (물론, ORDER BY 절을 사용하지 않고) 특정 순서로 행을 반환 보장되지 않는 것 같습니다.

    는 SQL-92 표준에 따라 (P 373). :

    좋아, MySQL은 완전히 SQL-92 호환되지 않습니다, 그러나 이것은 심각한 힌트입니다.

    (분명히 Percona와 제휴) Laurynas Biveinis는 말한다 :

    MySQL의 설명서는 InnoDB에 대해 말한다 :

    지금까지 내가 걱정하고, 나는 MySQL의는 OPTIMIZE 표 후도 재주문 행 또는 여러 삭제 및 삽입 후에도 재사용 빈 공간 (I이의 예를 찾기 위해 노력했다, 지금까지 실패) 할 수 가정합니다.

    테이블 구조를 감안할 때 최하위는, 불행하게도, 그 많은 요인이 행의 순서를 변경할 수도있다; 나는 확실하게 그들이 삽입 된 순서를 결정하는 해결책을 볼 수 없습니다. 당신이 테이블을 생성 물론 이후 모든 바이너리 로그를 유지하지 않는 한)

    그럼에도 불구하고, 당신은 여전히 ​​당신의 테이블에 시퀀스 열을 추가 할 수 있습니다. 기존 행 가능성이 부정확 한 시퀀스 번호를 할당 할 것이지만, 적어도 향후 행에서 제대로 순서가 될 것이다.

    ALTER TABLE maxID ADD sequence INT DEFAULT NULL;
    ALTER TABLE maxID ADD INDEX(sequence);
    ALTER TABLE maxID MODIFY sequence INT AUTO_INCREMENT;
    

    http://sqlfiddle.com/#!2/63a8d/1

  2. ==============================

    2.거의 완료. 당신은 삽입 순서를 얻기에 성공. 그래서:

    거의 완료. 당신은 삽입 순서를 얻기에 성공. 그래서:

    select myId, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as init ORDER BY myrow desc LIMIT 1;
    

    내 콘솔에서 나는 다음을 얻을 :

    mysql> select myId, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as
    init ORDER BY myrow desc LIMIT 1;
    +------+-------+
    | myId | myrow |
    +------+-------+
    | A003 |     4 |
    +------+-------+
    1 row in set (0.00 sec)
    

    최신 정보

    야크는 권리입니다. 내 솔루션은 결정되지 않습니다. 아마 기록 소량의 작동합니다. 내가 (여기 예) SELECT 문으로 정렬 기본의 포스트 abount 신뢰성의 톤을 발견했다. 다음 단계:

    나는 대답하지 알고 있지만, 문제를 진술하는 것은 문제를 제한 할 수 있습니다.

  3. ==============================

    3.당신의 삽입 스크립트에서, A004은 지난 삽입 된 기록이 아니다. 이 세 번째입니다. 당신이 알파벳 순서의 마지막 레코드를 (A004 인) 얻고 싶은 경우에, 당신은 사용해야합니다

    당신의 삽입 스크립트에서, A004은 지난 삽입 된 기록이 아니다. 이 세 번째입니다. 당신이 알파벳 순서의 마지막 레코드를 (A004 인) 얻고 싶은 경우에, 당신은 사용해야합니다

    select myID from maxID order by myID desc limit 1
    

    마지막 삽입 된 행을 원하는 경우에, 당신은 왜 당신의 테이블에 자동 증가 열을 추가 사용하지 않는? 즉 열이 이러한 종류의 포인트입니다. 자동 증가 열은 PK가 될 필요가 없습니다 (이 있어야하지만 당신은 선택의 여지가없는 경우에이 없음).

  4. ==============================

    4.LAST_INSERT_ID에 대한 MySQL의 도움말에서 언급 한 바와 같이, 당신은 단지 ** 자동 증가 컬럼으로 사용할 수 있습니다. 당신이 ID의 순서에 대해 뭔가를 알고있는 경우가 아니면 만들 ​​수없는이 수단은 당신을 위해 가장 최근에 삽입 된 행을 찾을 MYSQL. 그들이 당신의 예를 제시과 같이 분류되어 경우에, 당신은 사용할 수 있습니다

    LAST_INSERT_ID에 대한 MySQL의 도움말에서 언급 한 바와 같이, 당신은 단지 ** 자동 증가 컬럼으로 사용할 수 있습니다. 당신이 ID의 순서에 대해 뭔가를 알고있는 경우가 아니면 만들 ​​수없는이 수단은 당신을 위해 가장 최근에 삽입 된 행을 찾을 MYSQL. 그들이 당신의 예를 제시과 같이 분류되어 경우에, 당신은 사용할 수 있습니다

    SELECT *
    FROM maxID
    WHERE myId = max(myId)
    

    그러나 나는 테이블에 자동 증가 열을 추가 제안 다음 WHERE 절에서 () = LAST_INSERT_ID를 사용합니다. 마지막 ID를 구하는 방법에 대한 자세한 내용은이 페이지를 참조하십시오.

  5. ==============================

    5.그것은 단지 자동 증가 필드에 의해 생성 된 마지막 값을 반환하기 때문에 LAST_INSERT_ID이 작동하지 않습니다. 그러나 그 해결책은 올바른 궤도에있을 수 있습니다 생각합니다. 나는 자동 증가 정수 다른 열을 추가 건의 할 것입니다. 그런 다음 데이터를 삽입하고 그냥 LAST_INSERT_ID을 선택 삽입 된 행 ()을 검색 할 수 있습니다. 새로운 열의 최대 수를 선택하거나 정렬이 내림차순으로 (모든 프로세스에 의해 삽입 된) 가장 최근의 행을 검색합니다.

    그것은 단지 자동 증가 필드에 의해 생성 된 마지막 값을 반환하기 때문에 LAST_INSERT_ID이 작동하지 않습니다. 그러나 그 해결책은 올바른 궤도에있을 수 있습니다 생각합니다. 나는 자동 증가 정수 다른 열을 추가 건의 할 것입니다. 그런 다음 데이터를 삽입하고 그냥 LAST_INSERT_ID을 선택 삽입 된 행 ()을 검색 할 수 있습니다. 새로운 열의 최대 수를 선택하거나 정렬이 내림차순으로 (모든 프로세스에 의해 삽입 된) 가장 최근의 행을 검색합니다.

    당신은 당신이 알파벳 정렬 할 수있는 varchar 열을 사용하려면,하지만 당신이 삽입 된 마지막 행의 행 또는 가장 최근에 삽입 된 행 수 보장하지 않습니다.

    나는 당신이 필요로 할 수있는 생각할 수있는 다른 하나 개의 솔루션은 테이블에 삽입에게 그것을 행을 생성하는 저장 프로 시저를 만드는 것입니다, 다음에 반환합니다.

    @rowid 귀하의 사용은 단순히 행이 당신에게 반환되는 순서를 계산한다. 그들은 가장 최근에 오래된 순으로 당신에게 반환됩니다 보장은 없습니다. 행이 저장된 순서에 영향을 미칠 수있는 다양한 일이있다.

  6. ==============================

    6.다음 쿼리를 사용하십시오.

    다음 쿼리를 사용하십시오.

    Select * from maxID order by myId desc limit 1,1;
    
  7. from https://stackoverflow.com/questions/8923366/getting-last-record-from-mysql by cc-by-sa and MIT license