Cách đặt 'INSERT IGNORE' trong db_insert mà không cần db_merge


8

Có ai biết cách đặt 'INSERT IGNORE' trong db_insert không?

Tôi không thể sử dụng db_merge vì tôi sẽ chèn nhiều hàng.

$query = db_insert('table')->fields(array('foo', 'bar'));
foreach ($rows as $row) {
  $query->values(array(
    'foo' => $row->foo,
    'bar' => $row->bar,
  ));
}
$query->execute();

Câu trả lời:


5

Bạn có hai lựa chọn:

  1. Phân lớp InsertQueryvà thêm chức năng đó vào chính bạn (hiện không được triển khai)
  2. Sử dụng db_query()để chạy một chuỗi SQL thô thay thế.

Sự đề cập duy nhất INSERT IGNOREtrong codebase Drupal 7 là trong DatabaseConnection_mysql:nextId; nó không thực sự được sử dụng, nhưng ở vị trí của nó là một chuỗi truy vấn thô có chứa ON DUPLICATE KEY UPDATE, được truyền trực tiếp tới db_query().

Tôi có thể sai, nhưng tôi cho rằng đó là một dấu hiệu tốt như bất kỳ chuỗi SQL thô db_query()nào đi cùng.


3

Mặc dù không thể sử dụng "INSERT IGNORE", nhưng có một cách bạn có thể giải quyết vấn đề này trong PHP. Một cái gì đó như thế này:

try {
    $insertID = db_insert('crawl_data')->fields(array(
        'url' => $url, 
    ))->execute();
} catch (Exception $ex) {

}

Trong ví dụ này tôi có một cơ sở dữ liệu về "url". Nhưng trước tiên tôi không muốn kiểm tra xem mục đó có trong cơ sở dữ liệu không. Tôi muốn nó xảy ra trong một lần. Vì vậy, đây là loại hành vi tương tự như "chèn bỏ qua".

Tuy nhiên, nói chung là rất tệ khi có điều này:

catch (Exception $ex) {
    // open space
}

Vì vậy, nó có thể tốt hơn để làm điều này:

catch (Exception $ex) {
    $error = $ex->getMessage();
    if (strpos($error, 'SQLSTATE[23000]: Integrity constraint violation') !== false) {
        // then we know it's an error we can ignore
    }
    else {
        // just throw the error again
        throw $e;
    } 
}

Đó là cái này hoặc làm hai truy vấn cơ sở dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.