2013-04-26 3 views
0

그래서 mysql은 곱하기 테이블에 삽입을 지원하지 않습니다. 실제로 두 개 이상의 INSERT INTO 쿼리를 수행해야합니다. 하지만 내 문제는 두 테이블을 업데이 트하지만 하나가 존재하지 않는 경우 삽입합니다. 하나의 쿼리만으로도 가능합니까?존재하지 않는 경우 삽입 동일한 쿼리의 두 테이블에 대한 업데이트

나는 이것을 가지고있다.

UPDATE user, userdetails SET 
userdetails.firstname = ?, 
user.username  = ?, 
user.email    = ?, 
userdetails.location = ? 
WHERE user.id    = ? 
AND userdetails.user_id  = ? 

$values = array($firstname,$username,$email,$location,$_SESSION['id'],$_SESSION['id']); 

그러나 마지막 행

AND userdetails.user_id='{$_SESSION['id']}' 

로는 항상 뭔가 불길한도 있었다 DUPLICATE KEY UPDATE를 읽을 수 있지만 그들은 하나 개의 테이블보다 더 때문에 문제가 해결되지해야합니까?

사용자가 등록 할 때 기본적으로 user_id를 userdetails.user_id에 삽입하는 쿼리를 쉽게 만들 수 있지만 쿼리를 사용하는 것이 훨씬 더 좋을 것입니다.

+1

자리 표시자를 사용할 수 있으면 ** 모든 ** 및 ** 모든 ** 사용자 데이터에 사용할 수 있습니다. 여기에는'$ _SESSION'의 내용도 포함됩니다. 가능한 SQL 주입 버그에 노출되어있는 이유가 무엇보다 신비 스럽습니다. – tadman

+0

@ tadman 오른쪽. 그것을 업데이트했습니다. – Dymond

+0

작업은 [MERGE] (http://en.wikipedia.org/wiki/Merge_ (SQL)) 문입니다. 아쉽게도 AFAIK는 MySQL에서 지원하지 않습니다. –

답변

1

INSERT 문은 여러 테이블에 레코드를 동시에 추가 할 수 없습니다. table_a에 삽입 할 때, 당신의 트랜잭션의 시작 부분으로 롤백 할 수 있습니다 오류가 있다면

BEGIN 
INSERT INTO table_a (...) 
INSERT INTO table_b (...) 
COMMIT 

:이를 위해 당신은 간단한 거래를 할 수 있습니다. 이것은 일을하는 SQL 표준 방법입니다.

이미 존재하는 경우 INSERT ... ON DUPLICATE KEY을 사용하여 레코드를 업데이트하거나 충돌하는 레코드를 삭제하고 데이터로 바꾸는 비표준 MySQL REPLACE INTO을 사용할 수 있습니다.

+0

감사합니다! 내가 찾고있는 것이었다. 한 시간 후에 휴식을 취하십시오. 다시 감사합니다 – Dymond

관련 문제