2015-01-25 2 views
2

현재 기름 분포 관리 프로젝트를 진행하고 있으며 모든 청구서의 영수증이 필요합니다. 데이터 베이스. 나는 도시의 처음 2 글자, 주유소 ID, 자동 증분 번호, 달의 첫 번째 글자 및 한 해의 마지막 두 자리를 포함하는 영수증을위한 스마트 키를 작성하려고 생각하고 있습니다. 따라서 다소 비슷할 것입니다 : "AA-3-0001-J15". 내가 궁금해하는 것은 달이 바뀔 때 0001로 돌아가는 AI 번호를 만드는 방법입니다. 어떤 제안?월말에 자동 증분 값을 재설정하는 스마트 키를 만드는 방법

+2

해당 번호를 저장하지 마십시오. 선택한 쿼리에서 작성하십시오. –

+0

회계 목적으로 저장해야합니다. – xhulio

+1

이러한 키에 대한 추론을 알고 싶습니다. 이런 식으로 사용한 적이 한번도 없었습니다. 그런 접근법이 어떤 경우 유용한지를 아는 것은 흥미 롭습니다. –

답변

2

직접 질문에 답하려면 - 월 초에 숫자를 1로 다시 시작하는 방법.

단순한 IDENTITY 열이 아니므로 직접이 기능을 구현해야합니다.

이러한 복잡한 값을 생성하려면 사용자 정의 함수 또는 저장 프로 시저를 작성해야합니다. 테이블에 새 행을 삽입하기 위해 키의 새 값이 필요할 때마다이 함수를 호출하거나이 저장 프로 시저를 실행합니다.

두 개의 다른 세션이 동시에 행을 삽입하려고 할 때 함수/저장 프로시 저는 제대로 작동하는지 확인해야합니다. 가능한 한 가지 방법은 sp_getapplock을 사용하는 것입니다.

"자동 증가"숫자가 모든 도시와 주유소의 단일 순서인지 또는 각 도시와 주유소의 일련 번호인지 여부를 명확히하지 않았습니다. 같은 달에 모든 도시와 주유소에 대해 일련의 숫자가 하나 있다고 가정합시다. 달이 변경되면 시퀀스가 ​​다시 시작됩니다.

프로 시저를 실행할 때 다음 질문에 대답 할 수 있어야합니다. 현재 달의 첫 번째 행을 삽입하려는 행이 있습니까? 생성 된 값이 이번 달의 첫 번째 값인 경우 카운터를 1로 재설정해야합니다.

이 질문에 대답하는 한 가지 방법은 매월 한 행씩있는 도우미 테이블을 갖는 것입니다. 한 열 - 날짜, 두 번째 열 - 시퀀스의 마지막 번호. 그런 헬퍼 테이블이 생기면 스토어드 프로 시저가 다음을 확인합니다 : 현재 달은 무엇입니까? 이번 달에 마지막으로 생성 된 숫자는 무엇입니까? 헬퍼 테이블에 그러한 번호가 있으면 헬퍼 테이블에서 해당 번호를 증가시키고이를 사용하여 키를 작성하십시오. 헬퍼 테이블에 이러한 번호가 없으면 1을 삽입하고 키를 작성하는 데 사용합니다.

마지막으로이 합성 값을 테이블의 기본 키로 사용하지 않는 것이 좋습니다. 사용자 요구 사항에서 "이처럼 테이블의 기본 키를 만듭니다"라는 것은 거의 없습니다. 회계사가 보고서 및 사용자 인터페이스에서 거래 옆에있는 문자와 숫자의 마술 세트를 볼 수있는 한 내부적으로 처리하는 방법은 귀하에게 달려 있습니다. 회계사는 "기본 키"가 무엇인지 알지 못합니다. 그리고 도시, 주유소 등의 몇 가지 테이블을 함께 사용하여 정규화 된 데이터베이스에서 필요한 정보를 얻는 방법을 알고 있습니다.

아, 그런데 조만간 매월 9999 건 이상의 거래가있을 것입니다.

+0

잘 각 주유소에는 고유 한 순서가 있습니다. 그렇습니다. 기본 키가 아닐 수도 있지만 영수증의 ID로 고유해야하며, 거래 번호가 9999 이상일 수는 있지만 맞습니다. 쉽게 고정. 내가 원하는 건 다음 달에 다시 설정하는 방법입니다. 나는 달을 검사하고 자동으로 그것을 다시 놓기 위하여 상점 절차를 창조하는 것을 시도 할 것이다. 덕분에 나에게 좀 더 명확한 아이디어를 주었다. – xhulio

+0

@xhulio 각 주유소에 고유 한 순서가있는 경우 도우미 테이블에는 GasStationID 열이 하나씩 있으며 각 주유소마다 매월 한 행씩 표시됩니다. –

+0

@ xhulio 매월 카운터를 재설정해야하는 이유는 아직도 이해할 수 없습니다. 그 주유소의 전체 수명 동안 각 주유소에 대해 하나의 시퀀스를 갖는 것이 무엇이 문제입니까? –

2

모든 것을 하나의 열에 저장 하시겠습니까?

CREATE TABLE receipts (
    CityCode VARCHAR2(2), 
    GasStationId NUMERIC, 
    AutoKey NUMERIC, 
    MonthCode VARCHAR2(2), 
    PRIMARY KEY (CityCode, GasStationId, AutoKey, MonthCode) 
); 

사용중인 DBMS : 그건

어느 다음과 같이 할 수 ... 네 기둥 위에 합성 키처럼 나에게 소리?

당신이에서 실행되는 배치 작업을 할 수 MySQL이 있다면 실행 먼저 달 (MySQL은, MSSQL, PostgreSQL을, ...?) :

ALTER TABLE tablename AUTO_INCREMENT = 1 

을하지만 그 논리는 응용 프로그램 계층에있을 것입니다 DB- 레이어 대신 ...

+0

mssql을 사용하고 있으며, 모든 컬럼이 아닌 다른 컬럼의 서브 스트링으로 연결 키를 생성하는 것이 좋다. – xhulio

+0

테이블 영수증에는 이러한 속성 만있다. : 연결된 키, 연료 유형, 금액, 가격, 합계 – xhulio

+0

@xhulio 고객 대면 키를 저장하는 것과 관계없이 (원하는 형식으로 잘 연결될 수 있음) 관계없이 다음과 같은 백업 데이터를 저장하려고합니다. 이. 그리고 완전한 타임 스탬프를 저장하십시오. –

1

그런 경우이 키를 생성하고 저장하는 데 사용자 정의 함수를 사용하는 것이 가장 좋습니다. 마찬가지로 :

Create Function MyKeyGenerator(
@city varchar(250) = '', 
@gas_station_id varchar(250) = '') 

AS 


/*Do stuff here 

*/ 

내 생각 엔, 당신은 그 달의 마지막 자동 생성 수를 유지 다른 작은 테이블이 필요할 수 있습니다 당신은 한 달 동안 생성하는 첫 번째 레코드를 업데이트해야 할 수도 있습니다. 다음 레코드의 경우 해당 달에서 가져와 1 씩 증가시킵니다. 정수를 리턴 코드로 반환하는 저장 프로 시저를 사용할 수 있습니다 (자동 번호 부분에만 해당). 그런 다음 함수에서 나머지 작업을 수행 할 수 있습니다. 이개월이 같은 첫 글자를 가질 수 있기 때문에


, BTW 당신은 ​​달의 첫 글자를 사용하여 다음 사항을주의하는 함정이있다 할 수 있습니다. 그 달의 2 자리 숫자 나 달 이름의 처음 세 글자를 사용해보십시오.


정확하게 인공 지능 번호를 주장 정체성 유형이 될 수 없습니다 준비 당신이 경우, 당신이 아닌 정체성 일반 정수이고, 다른 테이블을 한 다음 SQL Server 에이전트 작업이 저장된 전화 실행할 수 있습니다 증가하는 사업을 할 절차.

+0

그보다 더 나쁩니다. 내가 그룹 단위의 시퀀스를 가질 필요가있는 곳을 생각할 수있는 유일한 시간은 대개 당신이 어떤 격차도 가질 수 없다는 것을 의미합니다 (운동 - 논리적으로, 왜?). 즉, 롤백시에도 프로 시저가 복원되어야하고 행이 커밋 될 때까지 차단되어야합니다. 예, 이것을 저장하는 테이블이 필요합니다. 그리고 꽤 많이 ... –

+0

저는 이런 키가 회계사처럼 최종 사용자에게 사용자 친화적 인 것으로 생각합니다. 누가 키를보고 어떤 달 등인지 알 수 있습니다. 그리고 보통, 회계사들은 열쇠에 대해 신성 모독입니다, 그들은 단지 그것을 원합니다. –

+1

어, 회계사는 어쨌든 _day_ 발생한 정보와 대부분의 다른 데이터를 알아야 할 것입니다. 영수증 테이블에서 그런 종류의 정보가 유지되지 않으면 다른 많은 문제가 발생할 것입니다. 영수증에있는 이런 종류의 ID는 원래 회사 회계사가 아니며 고객 대면 조회 등을 위해 수동 입력을 돕는 것입니다. –

관련 문제