2010-02-18 3 views
2

오늘 나는 A-My poor planning과 B- 데이터베이스 정규화 관행에 대한 전적인 무시에 대해 질문했습니다. this question. 지난 8 시간 동안 정규화 된 데이터베이스와 JOIN의 미세한 포인트에 대해 읽은 후 SQLZoo.com 튜토리얼을 진행했습니다.방금 ​​삽입 한 파일의 기본 키 ID를 얻으려면 어떻게해야합니까?

나는 깨달음을 얻는다. 나는 데이터베이스 정규화의 목적과 그것이 어떻게 적합한 지 이해한다. 다만 절차 적 관점에서 그 비전을 실행하는 방법을 완전히 모르겠다는 점을 제외하고는.

나의 오래된 비전은 다음과 같습니다. "파일"이라고 불리는 1 개의 테이블, 파일 아이디와 파일 url 및 해당 파일의 등급 수준 승인.

새로운 비전 !: "파일"을위한 1 개의 테이블, "성적"을위한 1 개의 테이블, 조정할 접합 테이블.

하지만 내 문제는 아닙니다. 이것은 확실한 대답을 가지고있는 정말 기본적인 Q입니다. "파일"에 레코드를 만들면 증가 된 기본 키가 자동으로 할당됩니다 (file_id). 그러나 지금부터는 file_id를 다른 테이블에도 쓸 필요가 있습니다. ID를 수동으로 할당하지 않기 때문에 ID가 무엇인지 어떻게 알 수 있습니까?

text.doc를 업로드하고 file_id 123이되면 "성적"과 접합 테이블에 쓰기 위해 123이 있다는 것을 어떻게 알 수 있습니까? 동시 사용자가있는 경우 다른 ID를 저장할 수 있기 때문에 max (file_id)를 수행 할 수 없습니다. 난 그냥 수동으로 할당하지 않고 file_id 값을 얻는 방법을 모르겠다.

답변

3

다음 예에서와 같이 LAST_INSERT_ID()을 사용할 수 있습니다 :

START TRANSACTION; 
INSERT INTO files (file_id, url) VALUES (NULL, 'text.doc'); 
INSERT INTO grades (file_id, grade) VALUES (LAST_INSERT_ID(), 'some-grade'); 
COMMIT; 

거래는 작업이 원자 유지되도록이 그 중 하나를 모두 삽입 성공적으로 완료 또는 전혀 보장합니다. 이는 선택 사항이지만 데이터 무결성을 유지하기 위해 권장됩니다. LAST_INSERT_ID() 들어

가장 최근에 생성 된 ID는 연결별로 서버에 유지된다.

다른 클라이언트에 의해 변경되지 않습니다. 다른 AUTO_INCREMENT 열을 비회원 값 (즉, 이 아닌 값인 0이 아닌 값)으로 업데이트하면 변경되지 않습니다. 여러에서 동시에 클라이언트를 LAST_INSERT_ID()AUTO_INCREMENT 열을 사용

완벽하게 유효합니다. 각각 클라이언트는 클라이언트 이 실행 된 마지막 문장에 마지막으로 삽입 된 ID를 받게됩니다.

소스 및 추가 읽기 : PHP에서

1

는 MySQL의 레코드의 자동으로 생성 된 ID를 얻을 수 귀하의 mysqli 개체의 mysqli->insert_id 속성을 사용합니다.프로그램이 LAST_INSERT_ID의 가치를 잊어 버린 후

1

당신은 어떻게, 내일 항목을 찾을거야()? 대용 키를 사용하여

괜찮지 만, 테이블은 여전히 ​​엔티티를 나타내며, 당신이 질문에 대답 할 수 있어야한다 :이 특정 엔티티를 정의 측정 어떤 속성? 이러한 속성 집합은 테이블의 고유 키이며 대리 키를 사용하는 경우에도 그러한 자연 키가 항상 있어야하며 테이블에서 정보를 검색하는 데 사용해야합니다. 대리 키를 사용하여 참조 무결성을 강화하고, 색인을 생성하고, 조인을 쉽게 수행 할 수 있습니다. 하지만 don't let them escape from the database

+0

실제 파일 테이블에는 해당 파일에 대한 많은 데이터가 있습니다. 업로드 한 사용자, 해당 파일의 고유 한 S3 URL 등 비전은 다른 사용자가 파일 검색 기준. 파일의 ID를 표시 스크립트로 POST하고 거기에서 찢을 수 있습니다. – GilloD

관련 문제