"INSERT..."를 하는 방법이 있습니까?Zend Framework 1.5의 중복 키 업데이트"에 대해 설명합니다.
사용하고 싶다ON DUPLICATE KEY UPDATE
Zend Framework 1.5에서 이것이 가능한가?
예
INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
저는 Zend에서 일했고 특히 Zend_Db에서 꽤 많이 일했습니다.
아니요, API는 지원되지 않습니다.ON DUPLICATE KEY UPDATE
구문을 사용합니다.이 경우 단순히 다음을 사용해야 합니다.query()
완전한 SQL 문을 직접 작성할 수 있습니다.
harvejs가 나타내는 것처럼 SQL에 값을 삽입하는 것은 권장하지 않습니다.쿼리 파라미터를 사용합니다.
편집: 다음을 사용하여 매개 변수를 반복하지 않도록 할 수 있습니다.VALUES()
표현.
$sql = "INSERT INTO sometable (id, col2, col3) VALUES (:id, :col2, :col3)
ON DUPLICATE KEY UPDATE col2 = VALUES(col2), col3 = VALUES(col3)";
$values = array("id"=>1, "col2"=>327, "col3"=>"active");
사이드바로서, 다음의 작업을 심플화할 수 있습니다.ON DUPLICATE KEY UPDATE
를 사용하여 스크립트에 필요한 처리량을 줄입니다.VALUES()
:
$sql = 'INSERT INTO ... ON DUPLICATE KEY UPDATE id = VALUES(id), col2 = VALUES(col2), col3 = VALUES(col3)';
상세한 것에 대하여는, http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html 를 참조해 주세요.
@Bill Karwin: 훌륭한 솔루션!단, 물음표 대신 명명된 플레이스 홀더(":id", ":col1" 등)를 사용하는 것이 좋습니다.array_marge에서 값을 복제할 필요가 없습니다.또한 "VALUES" 대신 "INSERT"의 "SET" 구문을 사용하는 경우, 코드는 모든 필드 집합에 대해 자동으로 생성되도록 더욱 단순해집니다.
$sql = 'INSERT INTO sometable SET id = :id, col2 = :col2, col3 = :col3
ON DUPLICATE KEY UPDATE id = :id, col2 = :col2, col3 = :col3';
$arrayData = array('column1' => value1, 'column2' => value2, ...)
class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
protected $_name;
protected $_primaryKey;
public function insertOrUpdate($arrayData)
{
$query = 'INSERT INTO `'. $this->_name.'` ('.implode(',',array_keys($arrayData)).') VALUES ('.implode(',',array_fill(1, count($arrayData), '?')).') ON DUPLICATE KEY UPDATE '.implode(' = ?,',array_keys($arrayData)).' = ?';
return $this->getAdapter()->query($query,array_merge(array_values($arrayData),array_values($arrayData)));
}
}
용도:
예: Model_Db_Contractors.php
class Model_Db_Contractors extends Model_Db_Abstract
{
protected $_name = 'contractors';
protected $_primaryKey = 'contractor_id';
...
}
Index Controller(인덱스 컨트롤러)php
class IndexController extends Zend_Controller_Action
{
public function saveAction()
{
$contractorModel = new Model_Db_Contractors();
$aPost = $this->getRequest()->getPost();
/* some filtering, checking, etc */
$contractorModel->insertOrUpdate($aPost);
}
}
대신 이것을 사용하세요.
REPLACE INTO sometable SET field ='value'.....
있는 경우 업데이트되고 없는 경우 삽입하기만 하면 됩니다.이것은 표준 mysql api의 일부입니다.
Pawel's Answer로 업데이트하여 별도의 삽입 및 업데이트 데이터를 지원하고 Zend DB Expressions도 지원합니다.
class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
protected $_name;
protected $_primaryKey;
public function insertOrUpdate($arrayData)
{
$insertDataValuesForQuery = [];
$queryParams = [];
foreach ($insertData as $key => $value) {
if (gettype($value) == "object") {
array_push($insertDataValuesForQuery, $value->__toString());
continue;
}
array_push($insertDataValuesForQuery, "?");
array_push($queryParams, $value);
}
$updateDataValuesForQuery = [];
foreach ($updateData as $key => $value) {
if (gettype($value) == "object") {
array_push($updateDataValuesForQuery, $key . " = " . $value->__toString());
continue;
}
array_push($updateDataValuesForQuery, $key . " = ?");
array_push($queryParams, $value);
}
$query = 'INSERT INTO ' . $this->_name . ' (' . implode(',', array_keys($insertData)) . ') VALUES (' . implode(',', $insertDataValuesForQuery) . ') ON DUPLICATE KEY UPDATE ' . implode(' , ', $updateDataValuesForQuery);
return $this->getAdapter()->query($query, $queryParams);
}
}
간단하게 다음과 같은 작업을 수행할 수 있습니다.
ID에 고유 색인 설정
그리고 나서.
try {
do insert here
} catch (Exception $e) {
do update here
}
언급URL : https://stackoverflow.com/questions/302544/is-there-a-way-to-do-an-insert-on-duplicate-key-update-in-zend-framework-1-5
'IT' 카테고리의 다른 글
개인 방법은 정말 안전한가요? (0) | 2022.11.27 |
---|---|
루프에서 나머지 작업을 실행하는 Java 스레드가 다른 모든 스레드를 차단합니다. (0) | 2022.11.18 |
MySQL 이름 배열이 아닌 곳? (0) | 2022.11.18 |
MySQL을 사용하는 float(24) 열에 필요한 스토리지 크기는 어떻게 됩니까? (0) | 2022.11.18 |
MySQL에서는 숫자를 인용해야 하나요, 말아야 하나요? (0) | 2022.11.18 |