programing

동일한 표에서 두 개의 증분 열

oldcodes 2023. 9. 1. 21:19
반응형

동일한 표에서 두 개의 증분 열

저는 여러 회사의 송장이 포함된 표를 가지고 있는데, 각 회사는 자체 송장 번호 시스템을 가지고 있어야 합니다.

id | invoiceId | companyId
--------------------------
1  | 1         | 1
2  | 2         | 1
3  | 1         | 2
4  | 1         | 3

여기에 설명된 MyISAM에 대한 이 접근 방식과 유사한 고유한 복합 키로 이를 달성하고 싶었지만 InnoDB에서는 불가능한 것 같습니다.

저는 삽입 후 즉시 새로운 ID를 반환해야 하며 PHP로 이를 달성하려고 하면 레이스 조건을 만들 수 있을지 걱정입니다.

트리거를 생성하는 것이 최선의 옵션입니까? 만약 그렇다면 어떻게 보일까요?저는 트리거에 대한 경험과 사용에 대한 연구가 없습니다.after insert트리거는 MariaDB 문서의 다음 인용문으로 인해 걱정이 됩니다.

제한 사항

보기에 AFTER 트리거를 생성할 수 없습니다.새 값은 업데이트할 수 없습니다.OLD 값은 업데이트할 수 없습니다.

조언 감사합니다.

다음 값을 가져오는 것 외에 고유한 인덱스를 추가해야 합니다.다음 값은 트리거를 사용하여 테이블을 쿼리하거나 트랜잭션 내의 일부 프로시저를 통해 얻는 것이 가장 좋습니다.이 경우 뷰에 대한 트리거 설명은 관련이 없습니다.

고유 인덱스는 companyId에 있습니다. invoiceId는 동일한 회사에서 실행되는 두 개의 삽입 프로세스가 송장을 추가하는 것을 방지하기 위해 필요합니다. 그러면 둘 다 동일한 invoiceId로 끝날 수 있습니다.트랜잭션을 사용할 수 있도록 InnoDB로 전환하는 것이 더욱 좋습니다.그러면 두 프로세스가 거의 동시에 시작되어 트랜잭션 격리의 이점을 얻을 수 있으며, 그 결과 프로세스가 직렬화되어 코드의 고유 인덱스 예외를 처리할 필요 없이 두 개의 고유 증분 송장 ID가 반환됩니다.

제가 알기로는 mysql의 last_id는 connection based이며, 글로벌하지 않고 프로세스 간에 공유되는 것으로 알고 있습니다.

이 간단한 스크립트를 사용하여 우려 사항을 확인했습니다.

(이것은 코드 서명자 구문이지만 비교적 이해하기 쉽습니다.)

(다른 브라우저 창에서) 서로 10초 이내에 다음 기능에 두 번 액세스했습니다.

function test(){
    $arr['var'] = rand(0,100000000);
    $this->db->insert('test_table',$arr);
    sleep(30);
    $id = $this->db->insert_id();
    var_dump($id);
}

흥미롭게도, 두 가지 모두에서 "2"를 반응으로 받는 대신, 저는 각각 1과 2를 얻었습니다.이는 기본 기능을 고려할 때 훨씬 더 의미가 있습니다.

function insert_id()
{
    return @mysqli_insert_id($this->conn_id);
}

이것은 반환된 ID를 해결합니다. 당신의 인종 조건은 기본적으로 "Select MAX(invoiceId) WHERE company"인 기본 쿼리의 곱입니다.ID = X"를 입력하고 +1을 추가한 후 삽입합니다.

삽입하기 전에 테이블 잠금을 사용할 수 있어야 하지만 이는 이 테이블이 업데이트될 것으로 예상되는 초당 횟수에 따라 다릅니다.

지속적인 연결에서는 last_insert_id가 다르게 작동할 수 있습니다. 아직 테스트하지 않았습니다.

언급URL : https://stackoverflow.com/questions/29685394/two-incrementing-columns-in-the-same-table

반응형