2010-05-06 3 views
0

웹 사이트에서 항목을 가져 오는 표가 있으며 해당 항목이 데이터베이스로 이동하면 언제든지 변경 될 수있는 범주 목록에 다음 범주가 지정되어야합니다. 때문에 나는 ID를 1, 6, 11 (5)의 첫 번째 범주를 매핑 같은 간단한 일을 할 수없는이 이유레코드가 들어오는 순서대로 데이터베이스 항목에 순환 카테고리를 지정하려면 어떻게합니까?

, 나는 현재 가능한 범주 목록에서 읽고 생각했습니다 (16)

, 마지막으로 삽입 된 값을 확인한 후 새 레코드에 다음 카테고리를 지정하지만 두 요청이 동시에 들어오는 경우 상상할 수 있습니다. 둘 다 동일한 카테고리를 순서대로 할당 할 수 있습니다.

  • 하면 새로운 행의 ID
  • 선택 얻을 기록에 새로운 행을 삽입 테이블 (카테고리 및 레코드) 잠금 :

    그래서, 생각의 내 현재의 라운드는 다음은 auto_inc_name desc 0, 1에 의한 순서를 사용하여 insertl 앞의 행
  • 이전 행의 카테고리를 취하고 고양이 목록에서 다음 문자를 가져옵니다.
  • 갱신
  • 테이블을 잠금 해제 새로운 삽입 된 행

나는이 잘 작동 100 % 확실하지 않다, 그것을 할 수있는 더 쉬운 방법이 가능성이있다, 그래서 내가 부탁 해요 :

A. 원래 문제에서 설명한대로 작동합니까? B.이 작업을 더 쉽고/간편하게 할 수 있습니까?

감사합니다 ~

난 그냥 하나 개의 항목 "last_category"(서명 TINYINT의 NOT_NULL)있는 테이블을 만들 ... 방법은 간단 그것을 할 것

답변

1

. 삽입 할 때마다 해당 값을 증가시키고 필요에 따라 재설정하십시오.

+0

좋아요 ...두 개의 웹 양식이 들어 오면 둘 다 해당 테이블을 쿼리하고 "마지막 범주 할당 됨"및 해당 접미사에 대해 동일한 대답을 얻습니다. 나는 여전히 테이블을 잠글 수 있지만, 매번 카테고리를 검색해야한다는 점을 감안할 때 거의 동일한 프로세스로, 다른 테이블을 도입하여 마지막 레코드의 가치를 찾는 단계를 절약 할 수 있습니다. – Stomped

+0

동시 제출이 걱정된다면 전체 프로 시저를 저장 프로 시저로 실행할 수 있습니다. 이전 트랜잭션이 완전히 완료 될 때까지 하나의 트랜잭션이 발생하지 않도록 보장합니다. 또한 "언제든지 변경됨"비트를 잊어 버렸습니다. 그것의 유동성이 있다면, 카테고리가 업데이트 될 때마다 카테고리 수를 쿼리하여 유효한 카테고리로 증가하는지 확인하십시오. – eykanal

0

은 내가 문제를 이해하지만, 내가 알고있는 당신이 어떻게 고유 auto_increment 열의를하는 것에 대한

category | data 
----------------- 
0  | lorem 
1  | ipsum 
....  | ... 
4  | dolor 
0  | sit 
...  | ... 

같은 것을 가지고, 그리고 카테고리는이 칼럼의 MOD 5하자 것이 확실하지 않다 ?

0

100 % 올바른 동작이 필요한 경우 모든 삽입이 제대로 정렬되도록 다른 어딘가에 잠글 필요가있는 것처럼 들립니다. 단일 SQL 문을 사용하여 데이터를 삽입하는 경우 카테고리 테이블 잠금을 피할 수 있습니다. 나는 MySQL이 어떻게 다른지 모르겠지만 오라클에서 나는이 작업을 수행 할 수 있습니다

insert into my_table (id, col1, col2, category_id) 
select :1, :2, :3, :4, c.id -- :1, :2, etc are bind variables. :1 corresponds to the ID. 
from 
    (select 
     id, -- category id 
     count(*) over (partition by 1) cnt, -- count of how many categories there are 
     row_number() over (partition by 1 order by category.id) rn -- row number for current row in result set 
    from category) c 
where c.rn = mod(:1, cnt) 

나는 그 순간에 존재 카테고리에 따라 다음 레코드를 삽입 한 성명에서이 방법. Insert는 커밋 할 때까지 my_table 테이블을 자동으로 잠급니다. 그것은 ID의 모듈러스 (modulus)에 기초하여 카테고리를 획득합니다. This link은 mysql에서 행 번호를 처리하는 방법을 보여줍니다. count(*)에 mysql이 group by이 필요한지 확실하지 않습니다. 오라클에서는 파티션을 사용하여 전체 결과 집합을 계산했습니다.

관련 문제