2012-08-30 1 views
1

Zend_db_table을 사용할 수 있다면이 방법을 찾는 것이 가장 좋습니다. 기본적으로 행을 삽입하고 값 중 하나가 동일한 DB에서 제공되므로이 값은 계속 변경되므로 삽입 된 데이터가 유효한지 확인할 필요가 있습니다. 먼저 값을 쿼리 한 다음 데이터를 변경할 수있는 두 쿼리 사이에 삽입 쿼리에 추가 할 수 없으며 잘못된 값을 삽입하게됩니다. 나는 테이블을 잠그는 것이 Zend가 지름길을 가지면 갈 수있는 방법인지 궁금합니다.Zend Db/Mysql - Select with Insert

저는 MySQL을 사용하고 있습니다.

[EDITED 들면

:이 표 ITEM_NUMBER라는 필드를 가지며, 각각의 새로운 행 I는 (동일한 item_family)에서 마지막 ITEM_NUMBER + 1을 그것으로 삽입한다. 그것은 수동 증가입니다. 이 예에서

TABLE ITEMS 
| item_id | item_family | item_number | name | 
| 15 |  1  |  10  | Pan  | 
| 16 |  2  |  1  | Dress | 
| 17 |  1  |  11  | Spoon | 

당신은 같은 item_family에서 이전 행은 10

감사 때문에 item_family 1에서 다음 행이 ITEM_NUMBER = (11) 볼!

+0

MySQL Web에서 이런 종류의 질의에 대한

$sql = INSERT INTO items (item_id, item_family, item_name, item_number) VALUES (item_id, item_family, item_name, (SELECT item_number FROM...)+1); $this->getAdapter()->query($sql); 

더 많은 정보 더 많은 비트를 설명 할 수 예를 들면 다음과 같습니다입니까? 이것은 조금 이상하게 들립니다. 끊임없이 변화하는 가치가 있지만, 다시 변화하기 때문에 읽을 수는 없습니까? 그래서 당신이 정상적인 방법으로 그것을 사용할 수 없다면 그것은 무엇을 위해 처음부터 바뀌 었습니까? –

+0

웹넷에 대해 설명했습니다. 감사. – Bema

+0

디자인에 이상이 있습니다. 왜 스스로 item_number 대신에'autoincrement'를 쓰지 않으십니까? –

답변

2

내 솔루션 (젠드를 사용)를 쿼리보다, 테이블을 LOCK했다 item_number, 결과를 삽입 쿼리에 추가하고, 테이블을 삽입하고 UNLOCK합니다. 잠금 및 잠금 해제 방법은 다음과 같습니다.

$sql = "LOCK TABLE items WRITE"; 
$this->getAdapter()->query($sql); 

//run select to get last item_number 
//append result to insert array 
//insert 

$sql = "UNLOCK TABLES"; 
$this->getAdapter()->query($sql); 

또 다른 방법은 값을 삽입하여 값을 선택하도록하는 것입니다.

1

item_id이 테이블의 기본 키인 경우 자동 증가 필드로 설정하면 Zend_Db_Table::insert() 함수는 삽입 한 행의 기본 키를 반환합니다.

$table = new Items(); 

$data = array(
    'item_family' => '1', 
    'item_number' => '10', 
    'name'  => 'Pan' 
    ); 

$itemId = $table->insert($data); 

또한 마지막으로 삽입 된 ID 기능을 직접 mysql을 호출 할 수 있습니다 : 예를를 들어

$itemId = $this->getAdapter()->lastInsertId('items'); 
+2

'item_id가 기본 키인 경우'Zend_Db는'protected $ _primary = 'item_id';를 선언하여 명시 적으로 모델에 명시하지 않는 한 Zend_Db가'id'를 기본 ID로 사용할 것을주의해야합니다. 그렇지 않으면 단순히 작업 –