database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 28030 게시물 읽기
No. 28030
mysql 입니다 테이블a 테이블b 부모 자식 관계일때 어떻게 코딩하시나요?
작성자
손님
작성일
2009-02-17 10:23
조회수
5,211

테이블a

테이블b

 

가있습니다

 

a가 부모고 b는 자식입니다

 

테이블 a는

a.id (오토인크리지) -- pk

 

테이블 b

b.id (오토인크리지) -- pk

b.p_id (테이블a의 id)

 

 

테이블 컬럼이 이런식으로 되어있어요

(b의 p_id 컬럼은 a.id 와 같다.. 라는말입니다)

 

 

일단..

a.id 의 현재 오토인크리지 값을 받아온후 (show table status where name = '테이블명'  쿼리사용)


변수에 저장해놓고

 

a테이블에 인서트

 

b테이블에 for문이 돌면서 인서트 되는 구조입니다..

 

 

 

그런데 테스트 할떈 잘됬었는데..

 

저기서 에러가 좀 나는 모양입니다..

 

여럿이 몰렸을때.. 에러가 나는거 같은데요..

 

 

다른 방법으로 하자면..

 

select  max(id) from 테이블a

 

로 해서 id 값을... 들구와서 ~~

 

a테이블에 인서트

b테이블에 반복문 돌면서 인서트

 

위처럼 할수있을꺼 같습니다..

 

근데... 두번째 방법의 경우에 사용자가 몰렷을때

 

max 값이 꼬일수가 있을꺼 같애서 첫번째 방법을 사용했는데

 

도대체 어떤게 맞는건지 모르겠네요..

 

 

 

이 글에 대한 댓글이 총 4건 있습니다.

위와 같은 방법이면 transaction/lock 없이는 꼬일 수 밖에 없어 보입니다.
효율은 나쁘지만 MyISAM인 경우 테이블 단위 락 하시면 됩니다.

a테이블의 read락을 거신 후에, 작업을 마치시고 락을 해제하면 꼬이는 문제는 해소될 것으로 보입니다.
락과 관련해서는 아래의 URL을 참조해주세요.
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

InnoDB등 다른 DB 형식을 쓰신다면 트랜젝션으로 검색해보세요.

박현우(lqez)님이 2009-02-17 15:11에 작성한 댓글입니다.

답변은 감사합니다..

그렇다면 이노디비 라고 치고..

저 위 두방법중 첫번째 방법을.. 많이 쓰는것으로 알고있습니다..


근데 두번째 방법은... 사용자가 몰릴때... 에러가 나는지요?

그 이유는 무엇인가요?
손님님이 2009-02-19 09:33에 작성한 댓글입니다. Edit

첫번째 방법이나 두번째 방법이나 꼬이는 이유는 같습니다.

서로 다른 둘 이상의 유저가 PK값을 확인하는 시점과 실제 값을 적용하는 시점이 겹치기 때문인데요, 사건(?) 경위는 다음과 같습니다.

(정상적으로 동작되려면)
A user : A테이블 MAX값 추출
A user : A테이블 추출 값 기준으로 A테이블 갱신
A user : B테이블 갱신
B user : A테이블 MAX값 추출
B user : A테이블 추출 값 기준으로 A테이블 갱신
B user : B테이블 갱신

(값이 꼬인 경우)
A user : A테이블 MAX값 추출
B user : A테이블 MAX값 추출
A user : A테이블 추출 값 기준으로 A테이블 갱신
B user : A테이블 추출 값 기준으로 A테이블 갱신하려 하나 PK 중복
A user : B테이블 갱신
B user : ----


A, B가 같은 값을 기준으로 +1해서 PK를 쓰려고 하니 B유저는 PK중복으로 데이터 처리를 못하거나 Failover때문에 오버헤드가 걸리게 되겠죠.

박현우(lqez)님이 2009-02-20 16:42에 작성한 댓글입니다.

http://kr.php.net/manual/en/function.mysql-insert-id.php

php 같은 경우는 mysql_insert_id 함수 등을 사용하면 꼬이는 문제를 피할 듯 한데, 저도 사용해본 적은 없습니다.

박현우(lqez)님이 2009-02-20 16:47에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
28034미러링 복구시 [2]
이성식
2009-02-17
4285
28033ASP.NET MYSQL 연동시 UPDATE문제
신찬섭
2009-02-17
4977
28031INSERT INTO A (SELECT * FROM A WHERE...) 질문입니다. [1]
에메랄드
2009-02-17
4781
28030mysql 입니다 테이블a 테이블b 부모 자식 관계일때 어떻게 코딩하시나요? [4]
손님
2009-02-17
5211
28029쿼리문 질문드립니다. 부탁드려요~~
웅사마
2009-02-16
5036
28028테이블 생성시 합계 컬럼에 대한 질문 [4]
최덕현
2009-02-16
4758
28026mysql 쿼리 질문입니다.. 도와주세요.. ㅠㅠ [6]
쿼리초보
2009-02-16
5098
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다