SQL: bir tablo içine sadece yeni satırlar / kayıtlarını mısınız?

5 Cevap php

Ben rutin bir json besleme ayrıştırma ve yem sadece yeni kullanıcılar eklemek ve mevcut kullanıcıları görmezden gerekir ediyorum.

Ben bir ON DUPLICATE KEY UPDATE veya INSERT IGNORE, bazı taramasına dayalı ne gerek düşünüyorum ama ben soruyorum neden olan oldukça emin değilim - yani örneğin:

users
1     John
2     Bob

Kısmi JSON:

{ userid:1, name:'John' },
{ userid:2, name:'Bob' },
{ userid:3, name:'Jeff' }

Bu yem sadece Jeff eklemek istiyorum. Ben bir INSERT yapmak değilse, ancak ben bir verimli ve pratik bir yöntem olmayacağını sanıyorum, tüm kullanıcılar ile basit bir döngü yapmak ve basit bir SELECT sorgusu yapmak ve kullanıcı kimliği tablosunda zaten olup olmadığını görebiliyordu.

Herkes belirli bir cevap hitap isterseniz arada, veritabanı etkileşim için Zend_Db kullanıyorum :) Ama genel bir stratejik çözüm umursamıyorum.

5 Cevap

Zend Framework için, ne yapmam insert deyimi bir try / catch ve istisna koduna göre daha fazla eylemi:

class Application_Model_DbTable_MyModel extends Zend_Db_Table_Abstract

    public function insert($aData, $bIgnore = false) 
    {

        try 
        {
            $id =  parent::insert($aData);
        } 
        catch(Zend_Db_Statement_Mysqli_Exception $e) 
        {
            // code 1062: Mysqli statement execute error : Duplicate entry
            if($bIgnore && $e->getCode() == 1062) 
            {
                // continue;
            } 
            else 
            {
                throw $e;
            }
        }
        return !empty($id) ? $id : false;
    }
}

Bir birincil veya unique anahtar gibi kimliği tanımlamak ve benzeri bir şey kullanmak gerekir:

INSERT IGNORE INTO table (userid, name) VALUES (2, 'Bob');

Userid 2 zaten varsa onu görmezden ve sonraki ekleme hareket edecek.

Ayrıca tablo şema üzerinde YİNELENEN KEY UPDATE kullanabilirsiniz. One other alternative might be to use the REPLACE INTO syntax.

REPLACE INTO table (userid, name) VALUES (2, 'Bob');

This will try to INSERT, if the record already exists it will DELETE it before INSERTing it again.

Benim çözüm:

/**
 * Perform an insert with the IGNORE word
 *
 * @param $data array
 * @return number the number of rows affected
 */
public function insertIgnore(array $data)
{
    // Start of query
    $sql = sprintf("INSERT IGNORE INTO %s (", $this->getAdapter()->quoteIdentifier($this->info('name')));
    // Retrieve column identifiers
    $identifiers = array_keys($data);
    foreach ($identifiers as $key => $value) {
        // Quote identifier
        $identifiers[$key] = $this->getAdapter()->quoteIdentifier($value);
    }
    // Concat column identifiers
    $sql .= implode(', ', $identifiers);
    $sql .= ") VALUES (";
    foreach ($data as $key => $value) {
        // Quote values
        $data[$key] = $this->getAdapter()->quote($value);
    }
    // Concat values identifiers
    $sql .= implode(', ', $data);
    $sql .= ")";
    // Process the query
    return $this->getAdapter()->query($sql)->rowCount();
}

Etkilenen bir satır, yeni bir giriş var demektir eğer döngü içinde, önce sen bir güncelleştirme yapabilirsiniz. Sonra yeni girişler gibi bunların bir ekleme yapmak bu 'güncelleştirmeleri başarısız' takip edin.

Ben Zend_Db'nin aşina değilim ama bir güncelleme kaç satır (lar) etkilenen olmadığını dönebilirsiniz varsayalım.