2017-05-08 7 views
1

특정 방식으로 필드를 증가시키기 위해 적절한 SQL 스크립트를 수행하는 데 어려움을 겪고 있습니다.mysql에서 고유 증분 값을 수행하는 방법

두 스크립트는 예외가 아니지만 결과에는 아무런 변화가 없습니다.

스크립트 1 :

UPDATE 
    myTable T1, 
    (
     SELECT id, 
       (@s:[email protected]+1) AS seq 
     FROM myTable, (SELECT (@s:=0) AS s) s 
     WHERE infotext IS NULL ORDER BY grouptext 
    ) T2 

SET sequence = seq 

WHERE T1.id = T2.id 

스크립트 2 :

UPDATE myTable AS target 

INNER JOIN (
    SELECT supfault_id, 
      (@s:[email protected]+1) AS seq 
    FROM myTable, (SELECT (@s:=0) AS s) s 
    WHERE infotext IS NULL ORDER BY grouptext 
) AS ordered ON ordered.id = target.id 

SET sequence = seq 
+0

무엇을 하시겠습니까? 새 레코드를 삽입 한 후 레코드를 업데이트 하시겠습니까? 또는 마지막 값을 얻은 다음 1 씩 증가시킵니다. –

+0

새로운 열이 추가 된 레코드가있는 테이블이 있습니다. 모든 값은 0으로 설정됩니다. 그리고이 값을 특정 방식으로 증가시켜야합니다. 레코드에는 자체 시퀀스 값이 있습니다. – domino

+0

현재 알파벳순 정렬을 수행하고 뷰에 정렬 된 데이터를 사용해야합니다. 하지만 프런트 엔드에서 알파벳순 정렬을 수행 할 수 없습니다. 장래에 사용자가 순서를 재 지정할 수있는 옵션을 갖게 될 것이기 때문입니다. – domino

답변

0

하위 쿼리를 별도로 작동하므로 하위 쿼리에서 seq로 시퀀스 값을 업데이트 할 수없는 이유가 궁금했습니다.

저는 전문가는 아니지만, 하위 쿼리에 가상 테이블을 사용해야 할 필요가 있다고 생각했습니다. 여기

은 내부에 가입하는 경우에 대한 솔루션입니다 :

CREATE TEMPORARY TABLE supportGroupSeqcalculation AS 
    SELECT supfault_id, 
      (@s:[email protected]+1) AS seq 
    FROM myTable, (SELECT (@s:=0) AS s) s 
    WHERE infotext IS NULL 
    ORDER BY grouptext; 

UPDATE myTable AS target 
INNER JOIN supportGroupSeqcalculation AS ordered ON ordered.supfault_id = target.supfault_id 
SET sequence = seq; 

DROP TEMPORARY TABLE supportGroupSeqcalculation; 

우리는 임시 테이블 특정 순서로 얻을 시퀀스 값으로 기록 할 수 있습니다.

임시 테이블을 삭제할 필요는 없으며 현재 세션에서만 존재합니다.

0

이것은 다음 표 2 업데이트 하나 마지막 내림차순 표에서 값과 증가를 얻을 수 :

set @inc = 0; 
select cast(valToIncrement as signed) into @inc from 
(select REPLACE(fkid,' ','') as valToIncrement from tbl_1 ORDER BY fkid)as a ORDER BY valToIncrement desc limit 1; 

update tbl_2 set fkid = @inc + 1 where fkid = 122; 
+0

그냥 테이블의 실제 이름을 바꾸고 열 이름을 바꿉니다. –

+0

조금 읽기가 힘듭니다. 나는 증분을하는 방법이 더 분명히 존재한다고 생각한다. 사실 내가 특정 방식으로 정렬을 수행해야하므로 내 스크립트에서 subselect를 사용하여 업데이트를 수행합니다. subselect에서 필요한 순서로 필요한 것을 얻을 수 있으며 subselect에서 seq로 시퀀스 값을 업데이트하면됩니다. – domino