2009-12-07 8 views
2

"레코드"를 저장하고 이미 기본 키가있는 테이블이 있습니다.mysql에서 "보조 ID"만들기

Table A 
======= 
id (INT) PK auto_increments 
project_id (INT) 
record_text (TEXT) 

이 테이블에는 모든 프로젝트의 "레코드"가 저장됩니다. 프로젝트에 대해 자동으로 증가하는 보조 키를 갖는 것이 바람직합니다.

예 : 프로젝트 1의 ID가 (1,5,8,9) 인 경우. 이를 저장하고 사용자에게 (1,2,3,4)으로 제시하는 것이 바람직합니다.

TRANSACTIONS를 사용할 수 없으며 동시성 문제가 발생하지 않고이 작업을 수행하는 방법을 생각하고 있습니다.

잘하면 내 문제가 분명히 나타납니다. 도와 주셔서 미리 감사드립니다.

편집 (예) :
아이디, PROJECT_ID 기록 텍스트 프로젝트에 대한
1 일 테스트
2 일 테스트
3 2 테스트
4 일 테스트

내 ID 년대 : 구조를 가정 1은 1,2,4입니다. 하지만 저장하고 당신은 그것을 열쇠없이뿐만 아니라 AUTO_INCREMENTPROJECT_ID 필드를 만들 수 있습니다 1,2,3

+1

나는 'id'를 새로운 숫자로 바꾸고 싶지는 않다고 덧붙여 야합니다. 가입 할 추가 필드 또는 두 번째 테이블이 트릭을 수행합니다. – ws0x9

+0

"id_shown"일까요? – namespaceform

답변

0

는 내가 너무 늦게 아마도 하루에, 무슨 생각 모르겠지만, 테이블에 열을 추가하여이를 달성 할 수 있었다 다음의 번호 시스템 인

id, pid, project_id, record_text 

pid 계획.

INSERT :

INSERT INTO A (id, pid, project_id, record_text) 
VALUES (
    NULL, 
    (SELECT COALESCE(new_id, 0) + 1 FROM (SELECT MAX(new_id) AS new_id FROM atest WHERE project_id = 1) AS x), 
    1, 
    'some text' 
); 

이제 내 프로젝트 내 pid, ID가 너무 프로젝트, 자동 증가를 기반으로 변경과 같이

id pid project_id record_text 
1  1  1    testing 123 
2  2  1    testing 123 
3  1  2    testing 123 
4  3  1    testing 123 

는 귀하의 의견에 대한 여러분 모두 감사합니다 내가 사과 문제에 대한 나의 가난한 설명.

0

로 프로젝트 1을 표시하는 방법을 찾고 있어요.

+0

나는 그가 자동 증가 자체가 아닌 행 삭제에 기인한다고 생각한다. 기본 ID는 아마도 auto_incremented이지만 문제를 해결하지는 못합니다. 그는 행 1, 2, 3 및 4가 있고 행 3을 삭제 한 경우 행 1, 2, 4를 1, 2, 3으로 표시하고 해당 번호에 대한 참조를 유지할 수 있다고 말합니다. –

1

질문에서 알 수 없지만 번호가 매겨진 목록을 사용자에게 표시하려는 경우, 나는 UI에서 이것을 처리 할 것이다. 그것을 데이터베이스에 저장하는 것에 대해 걱정하지 않아도됩니다.

DB에 실제로 저장하려면 INSERTED에 트리거를 사용하여 해당 값을 설정하십시오.

+0

Crowe 님의 의견에 따르면, 삭제의 경우 번호를 다시 매길 수도 있습니다. –

+0

그냥 표시하는 것이 좋습니다. 나는 장기적으로이 가치를 좋게한다고 생각합니다. 첫 번째 생각은 삽입을 수행 한 다음 프로젝트 레벨 ID를 증가시키는 것입니다. 내가 더 나은 방법으로해야한다고 생각합니다. – ws0x9

+0

이 칼럼에 대한 추론을 자세히 설명해 주시겠습니까? –

1

당신은 MySQL의 변수를 사용하여 행 번호를 생성 할 수 있습니다 : 프로젝트가 마지막 행과 다른 경우 if

select 
    id 
, project_id 
, if (@last_id = project_id, @n, @n := @n + 1) as RunningProjId 
, record_text 
, @last_id := project_id 
from (select @n := 0, @last_id := -1) r, A 
order by project_id 

행은 @n 변수를 증가시킨다. 이 기능은 order by 절을 사용합니다. 다음 행이 선택 될 때 참조를 위해``@last_id : = project_id saves the project_id`가있는 행.

from 절의 첫 번째 부분은 변수 초기화입니다. 두 번째 부분은 A이라는 테이블입니다.

+0

이 쿼리를 적용하려고 시도했지만'RunningProjId'는'project_id' 번호를 다시 매 깁니다. 나는 ID 번호를 다시 매기는 것을보고있다. 나는 지금 그것을 망치고있다. ... 유망한 것처럼 보인다. – ws0x9

+0

그래, 할 일은 모두 변경했다. @last_id = project_id to @last_id = id – ws0x9

+0

Andomar에게 감사하지만 잊지 마라! – ws0x9