2016-08-09 3 views
1
CREATE TABLE Apps 
(
    id int NOT NULL, 
    company varChar(20) NOT NULL, 
    name varChar(20) NOT NULL, 
    CONSTRAINT company_app_id PRIMARY KEY (id, company) 
) 

------------------------------------- 
| id | company  | name   | 
------------------------------------- 
| 1 | Google  | Google Maps | 
| 2 | Google  | Gmail  | 
| 1 | Apple  | Safari  | 
| 3 | Google  | Chrome  | 
| 2 | Apple  | Pages  | 
------------------------------------- 

위의 테이블을 작성하여 회사 고유의 ID를 자동 증가시킬 수있는 방법이 있습니까? 따라서 다음 항목이 Google 앱인 경우 ID를 4로 자동 증가시킵니다. 그 다음 항목이 Apply 앱인 경우 ID가 2로 자동 증가됩니까?중복 값 및 다중 열 기본 키가있는 SQL 자동 증가 ID?

감사

+0

어떤 RDBMS가 이것에 해당합니까? 태그를 추가하여 mysql, postgresql, sql-server, oracle 또는 db2 중 어느 것을 사용하는지 지정하십시오. –

+1

나는 그것을 MySQL이라고 추론한다. 단서는'int (20)'입니다. –

+1

당신은 할 수는 있지만 장점은 없습니다. 이는 관리해야 할 두통 일 수 있습니다. 정기적 인 자동 증가 필드를 사용하고 필요에 따라이 논리를보기에 빌드하십시오. – sgeddes

답변

3

아니, 당신의 INSERT 테이블 잠금을 수행하지 않는 한이 작업을 수행 할 수있는 방법이 없습니다. 그 이유는 INSERT가 행을 삽입하려는 각 회사에 대해 지금까지 최대 값을 알아 내야하기 때문입니다. 최대 값을 가진 행은 테이블의 어느 위치 에나있을 수 있습니다. INSERT는 다른 INSERT가 동시에 실행되는 것을 방지하는 동안 INSERT를 검색해야합니다. 그렇지 않으면 경쟁 조건이 있습니다.

이 테이블 잠금 동작은 InnoDB 테이블에 대한 INSERT에서 지원되지 않습니다. InnoDB는 테이블 당 하나의 최대 값을 추적하기 때문에 동시 INSERT를 허용하는 자동 증가를 수행 할 수 있으며, 증가 만하며 뒤로 이동하거나 "실행 취소"증분을 수행하지 않습니다.

MyISAM은 복합 기본 키를 사용할 때 고유 값 별 증분 기능을 지원합니다. 결국, MyISAM은 이미 INSERT 또는 다른 업데이트에 대해 테이블 ​​잠금을 수행합니다. 필자의 의견으로는이 기능만으로 MyISAM을 사용하는 것이 타당하지 않다.

@sgeddes가 위에서 언급 한 것처럼,이 작업을 수행하는 가치는 어쨌든 의심 스럽습니다. 행을 삭제하거나 INSERT가 롤백 된 경우와 같이 틈이 나타날 때 무엇을합니까? 기본 키의 번호를 다시 지정해야합니까? 수천 개의 행을 업데이트 할 수 있습니까? 간격에 후속 행을 삽입하려고합니까? 이렇게하면 다른 테이블 잠금 장치가 필요하며이를 수행하는 동안 간격을 검색하고 다른 삽입을 차단합니다.

기본적으로이 규칙을 염두에 두십시오. 기본 키는 행 번호가 아닙니다. 하나처럼 취급하지 마십시오. 기본 키에는 고유 값이 있어야하지만 연속 값은 필요하지 않습니다.


댓글 : 아니요, 자동 증가 숫자는 의미가있는 것으로 생각해서는 안되며, 생성 순서도 생각해서는 안됩니다. 한 가지로, auto-inc 값의 순서는 항상 행이 커밋되는 순서는 아닙니다.

Rails가 데이터베이스에 소금에 대해 알려주는 것이 좋습니다. Rails의 설계자는 실제로 데이터베이스 개발이 그보다 간단 해지기를 정말로 원했습니다. Rails는 지난 10 년 동안 개발자들에게 엄청난 불만을 나타 냈습니다.

+0

항목을 삭제했기 때문에 ID가 재사용되지 않는다는 것이 자명하지는 않습니까? 아마도 나는 여기에 내 생각에 너무 많은 레일 편견을 가지고 있지만, 창조의 순서를 나타내는 일종의 비 시간 관련 타임 스탬프와 같은 ID를 본다. – TiggerToo

+2

@TiggerToo - 그렇지 않습니다. 고유 한 식별자입니다. 그것은 그 외에는 아무것도하지 않습니다. 재사용 할 수없고, 간격을 채울 수 없으며, 회사마다 증가하도록 강요 할 수 없으며, 그 가치를 예측할 수 없습니다. 그것은 많은 연결이 그러한 가치를 "경쟁"하는 동시 환경에서 행에 고유 한 것을 제공합니다. 이렇게 동작하는 이유는 확실합니다. 그 이유는 동시성 + 성능이며 이러한 기능을 구현하는 유일한 방법입니다. 다른 것이 필요한 경우 레코드를 열거하는 절차를 구현하십시오. – Mjh