MariaDB의 Import된 테이블에서 ID가 중복되지 않도록 하려면 어떻게 해야 합니까?
(그전에 제가 영어를 못해서 죄송합니다)이런 공부 사례가 있습니다.
현재 웹 어플리케이션에 문제가 있습니다.나는 어떤 회사의 웹 어플리케이션을 만들었다.저는 CodeIgniter 3을 사용하여 앱을 만들었습니다.
저는 마리아 DB를 사용하여 데이터베이스를 구축했습니다.각 테이블의 ID에 대해 각 테이블의 응용 프로그램 데이터베이스에 대해 자동 증분 ID를 사용하고 있습니다.저는 보통 웹 앱을 클라우드 서버에 배포합니다(회사에는 전용 서버가 있지만 없는 경우도 있습니다).어느 날 제가 만든 앱을 클라우드에 도입하고 싶지 않은 회사가 있습니다(보안상의 이유로).
이 회사는 사무실 내 직원 PC에 개인적으로 앱을 도입하고 싶었지만 직원 PC는 서로 연결되어 있지 않았습니다(즉, 독립형 PC/퍼스널 컴퓨터/종업원 노트북).5개월마다 종업원의 PC에서 회사의 데이터 센터로 모든 데이터를 수집한다고 합니다.물론 데이터 센터는 인터넷에 연결되어 있지 않습니다.데이터를 저장하는 좋은 방법이 아니라고 말했습니다(모든 테이블의 열 ID가 자동 증분 ID이고 기본 키이기 때문에 모든 데이터를 하나로 병합하려고 하면 데이터가 중복되기 때문입니다).아쉽게도 회사는 여전히 앱을 그렇게 유지하고 싶어하고 있으며, 저는 이 문제를 어떻게 해결해야 할지 모르겠습니다.
그들은 이 웹 앱을 사용할 직원이 최소 10명 이상 있습니다.그래서 개인적으로 앱을 10대의 PC에 도입해야 합니다.
추가 정보 : 각 직원은 회사로부터 받은 고유 ID를 가지고 있으며, 아래 표와 같이 각 직원의 auto_increment ID를 만들었습니다.
id | employee_id | employee_name |
1 | 156901010 | emp1
2 | 156901039 | emp2
3 | 156901019 | emp3
4 | 156901015 | emp4
5 | 156901009 | emp5
6 | 156901038 | emp6
문제는 해당 응용프로그램에서 양식을 채울 때마다 일부 테이블이 직원의 ID가 아닌 증분 ID에서 가져온 새 ID가 저장된다는 것입니다.
예를 들어 표.이러한 속성은 다음과 같습니다.
| id | electronic_part_name | kind_of_electronic_part_id |
emp1
웹 앱에서 양식을 작성하십시오. 표의 내용은 다음과 같습니다.
| id | electronic_part_name | kind_of_electronic_part_id |
| 1 | switch | 1 |
, 「」의 는,emp2
웹 앱에서 양식을 작성하십시오. 표의 내용은 다음과 같습니다.
| id | electronic_part_name | kind_of_electronic_part_id |
| 1 | duct tape | 10 |
표의 내용을 데이터 센터에 병합하려고 하면 중복된 ID로 인해 테이블이 무너집니다.
다른 테이블에 있는 내 외국 열쇠에 대해 생각하면 점점 더 나빠진다.예를 들면customer_order
table.syslog를 클릭합니다.
:customer_order
열은 다음과 같습니다(표본일 뿐 실제 표는 아니지만 유사합니다).
|id | customer_name | electronic_parts_id | cashier(a.k.a employee_id, the increment id one, not the id that employee got from a company as i described above ) |
| 1 | Henry | 1 | 10 |
| 2 | Julie | 2 | 9 |
이 문제를 해결하는 방법을 아는 사람이 있습니까?아니면 이 문제를 해결할 수 있는 좋은 방법을 제안/권장해 주실 수 있습니까?
메모: 종업원마다 앱용 데이터베이스가 있기 때문에 데이터베이스는 일원화되어 있지 않고 스탠드아론 데이터베이스입니다.즉, 종업원의 PC에 데이터베이스를 하나씩 설치해야 합니다.
이것은 파격적인 상황이며, 여러분은 파격적인 해결책을 가질 수 있습니다.
이 문제를 해결하기 위한 두 가지 방법을 제안할 수 있습니다.
프라이머리 키에 자동증분을 사용하는 대신 UUID를 생성하여 프라이머리 키로 사용합니다.랜덤 UUID의 중복 가능성에 대하여: 향후 100년간 초당 10억 개의 UUID를 생성한 후에만
CodeIgniter에서는 다음과 같은 코드 스니펫을 사용하여 이를 수행할 수 있습니다.
$this->db->set('id', 'UUID', FALSE);
그러면 36자의 16진수 키(4개의 대시 포함)가 생성됩니다.
ac689561-f7c9-4f7e-be94-33c6c0fb0672
스트링에 대시가 포함되어 있는 것을 알 수 있듯이 CodeIgniter DB 함수를 사용하면 데이터베이스에 대시가 삽입되어 동작합니다.깨끗해 보이지 않으면 문자열을 삭제하고 32 문자 키로 변환할 수 있습니다.
[CodeIgniter UUID 라이브러리][1]의 도움을 받아 다음 기능을 사용할 수 있습니다.
function uuid_key { $this->load->library('uuid'); //Output a v4 UUID $id = $this->uuid->v4(); $id = str_replace('-', '', $id); $this->db->set('id', $id, FALSE); }
이제 32바이트의 키가 생겼고
ac689561f7c94f7ebe9433c6c0fb0672
이 상황에 대처하기 위한 또 다른 비상식적인 방법은 사이트에서 처리된 모든 삽입, 업데이트, 삭제 쿼리를 로컬로 파일에 기록하는 기능을 추가하는 것입니다.이렇게 하면 각 로컬 구현에서 올바른 순서대로 시간이 지남에 따라 DB를 수정하는 실제 쿼리 목록이 포함된 로그 파일이 생성됩니다.
데이터베이스 상태는 그 날짜까지 과거에 발생한 모든 쿼리의 집합의 결과입니다.
따라서 5개월마다 직원 PC에서 데이터를 수집할 준비가 되면 데이터를 덤프하는 대신 이 파일을 모든 쿼리 로그와 함께 가져오십시오.(주의: 이러한 쿼리 로그는 데이터베이스를 향해 실행될 때만 실시간으로 생성되므로 자동 증분 ID를 가지지 않습니다.)
이러한 파일을 사용하여 데이터를 데이터 센터로 가져옵니다.이것은 데이터 센터에 실시간으로 자동 증가를 생성하므로 충돌하지 않습니다.(앞으로 로컬과 데이터센터를 연결할 필요가 없기를 바랍니다.)
[1]: https://github.com/Repox/codeigniter-uuid
그런가요?id
다른 테이블에서 사용할 수 있습니까?아마 그 일이 일어날 것이다.JOIN
이 경우 ID를 풀어야 하는 큰 문제가 있습니다.
이 경우,id
다른 곳에서는 사용되지 않으므로 값은 관련이 없으며 행에 번호를 다시 매길 수 있습니다.이것은 다양한 소스로부터의 데이터를 같은 테이블에 로드하는 것으로(개략적으로 말하면), 행해집니다만,id
하중을 받고 있습니다.
또는 다음과 같은 다른 열(또는 열 조합)이 있는 경우UNIQUE
, 그 다음에 그것을PRIMARY KEY
제거하다id
.
어떤 경우에 해당됩니까?우리는 더 자세히 추구할 수 있다.제공해주세요SHOW CREATE TABLE
관련 테이블(복수 가능)을 참조해 주세요.
첫 번째 경우(다른 곳에서 ID가 FK로 사용됨)에는 다음과 같은 작업을 수행합니다.
행을 테이블에 삽입하는 동안id
는 기존 ID와의 충돌을 피하기 위해 값을 충분히 늘립니다.그런 다음 (같은 트랜잭션에서) 다음을 수행합니다.
UPDATE the_other_table SET fk_id = fk_id + same_increment.
필요에 따라 다른 테이블과 각 ID에 대해 반복합니다.
내 생각에 네 문제는 네 데이터베이스에서 오는 것 같아디자인을 잘 못하셨네요.두 명의 다른 사용자를 위한 ID가 있는 경우 버그입니다.
데이터베이스에서 ID 필드를 고유하게 만든 경우 두 직원이 동일한 ID를 가지지 않으므로 테이블 설계에 문제가 있습니다.
id 필드를 이렇게 시작하면 문제가 해결됩니다.
CREATE TABLE [YOUR TABLE NAME](
[ID] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
....
ID가 정수여야 합니까? 그렇지 않은 경우 ID에 접두사를 사용하여 각 직원의 입력이 일반적으로 고유하도록 할 수 있습니다.즉, 자동 증분을 포기하고 테이블 데이터만 카운트해야 합니다(레코드를 삭제하지 않습니다).
이것을 취급하려면 , PHP 로 코드를 작성할 필요가 있는 경우가 있습니다.다른 테이블이 이미 고유 키/프라이머리 키를 따르고 있는 경우 이상 없습니다.
Import 후에 할 수도 있습니다.이와 같이 MySQL의 동일한 테이블에서 중복 항목 찾기
언급URL : https://stackoverflow.com/questions/48416802/how-do-i-prevent-the-duplicate-id-from-the-imported-table-in-mariadb
'source' 카테고리의 다른 글
j클래스별 요소 카운트 쿼리 - 이를 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.05 |
---|---|
MySQL Workbench EER 다이어그램의 여러 열에 고유 제약 조건 생성 (0) | 2022.11.05 |
mysqldump: 쓰기 오류 번호 28이 표시됨 (0) | 2022.11.05 |
Python: 목록에서 찾기 (0) | 2022.11.05 |
타임스탬프 열 업데이트 시 이상한 동작 (0) | 2022.11.05 |