2014-12-09 3 views
3

저는 간단한 테이블을 가지고 있습니다. 논리는 새로운 행을 삽입하기 전에 그 테이블에서 하나의 열을 가져와야한다는 것입니다. 설명해 드리죠 :mysql을 선택하여 안전하고 빠르게 PHP로 삽입하십시오.

table

id key  groupId  Note 
1 00001  1  abd 
2 00002  1  aasdas 
3 00003  1  aasdas 
4 00001  2  q2eqwd 
5 00002  2  qwdvvd 
6 00003  2  qwrqw 
7 00004  2  qwdqdqw 

각의 groupId에 대한 자동 증가와 같은 주요 증가 참조하십시오. ID가 2 인 그룹이 새 메모를 추가하려고 할 때 마지막 키를 알아야합니다. 그것을 찾은 후, PHP는 마지막 키에 +1을 추가하고 새로운 행을 삽입합니다.

$groupId = 2; //for example 
$note = $_POST['note']; 

$select = $db -> prepare("SELECT key FROM table where groupId = :groupId ORDER BY id DESC limit 1"); 
$select -> bindValue(":groupId", $groupId, PDO::PARAM_INT); 
$select -> execute(); 
$fetch = $select -> fetch(PDO::FETCH_ASSOC); 

$lastKey = $fetch['key']+1; 

$insert = "INSERT INTO table (key, groupId, note) VALUES(:key, :groupId, :note)"; 

$ins = $db -> prepare($insert); 
$insert -> bindValue(":key", $lastKey, PDO::PARAM_INT); 
$insert -> bindValue(":groupId", $groupId, PDO::PARAM_INT); 
$insert -> bindValue(":note", $note, PDO::PARAM_STR); 

이 방법은 나를 위해 좋은 작동하지만, 테이블에서 마지막 키를 가져 오는 동안 나는 어떤 충돌이있을 것이다 여기의 두려워 : 나는 그것을 아래 좋아합니까? 동시에, 동일한 groupId를 가진 10 명의 사용자가 새로운 행을 추가 할 수 있기 때문입니다. PHP가 그룹 ID 2를 사용하는 3 명의 사용자에게 동일한 키를 동시에 가져올 수 있습니까?

빠르고 안전한 방법이 있습니까?

+1

충돌이 발생합니다. 그래서'key'는'auto_increment'이어야하고 PHP를 통해서해서는 안됩니다. –

+0

하지만 키를 다른 groupId에 대해 반복 할 수 있습니다. Differenf GroupId가있는 동일한 키가있을 수 있습니다. – Rashad

+1

프로그래밍 언어를 사용하여 아무 것도 생성하지 않으면 (삽입을 위해) 독창성을 보장 할 수 없다는 사실은 사실입니다. 어떤 언어로이 작업을 수행하려면 동일한 문제가 발생합니다. 이것은 당신이하고 싶은 것이 무엇인지를 분석하는 데에 우리를 다시 데려옵니다. 테이블이 있고, 테이블에 키가 있으며, groupId와 note가 있습니다. 그런데 왜이 열쇠가 어떤 방식으로 순차적이어야합니까? 아시다시피, 당신은 실제로 차선의 데이터 모델에서 오는 문제입니다. 이와 같은 시퀀스를 생성하기 위해 PHP를 사용하는 것은 동시성을 처리해야하기 때문에 어렵습니다. 즉, MySQL에서 벗어나는 것을 의미합니다. –

답변

1

AUTO_INCREMENT으로 MyISAM을 사용하면됩니다. MySQL의 Docs에서

:

의 MyISAM 당신이 다중 컬럼 인덱스의 보조 열을 AUTO_INCREMENT를 지정할 수 있습니다 BDB 테이블의 경우. ... 데이터를 정렬 된 그룹에 넣으려는 경우에 유용합니다.

그렇지 않으면 SELECT MAX(key) + 1 FROM table WHERE groupID = 1과 같은 하위 쿼리를 사용하여 삽입 쿼리의 값을 설정하고 값을 다시 읽어야합니다.

+0

이것은 내가 필요한 것입니다. 좋아! – Rashad

관련 문제