2012-09-19 25 views
7

Estoy insertando un nombre, número y compañía en una base de datos.Actualice una fila si existe, si no cree una nueva MySQL

Mi mesa es simplemente:

id(primary key) 
name 
slideView 
company 

tengo que actualizar esta información si un nombre pasó a ella existe, si no crear una nueva fila con estos datos. Miré REPLACE INTO, pero no creo que me sirva ... ya que no toco la identificación.

Mi código es:

insertData($name,$count,$company); 

function insertData($name, $count, $company) { 

    #Try/Catch statement to connect to DB, and insert data 
    try { 
     #DB username/password 
     $usernameDB = '****'; 
     $passwordDB = '****'; 

     #Create new PHP Database Object with the address, username, and password as parameters 
     $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB); 

     #Set pdo attributes to handle errors 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     #assign the sth variable (sth means statement handle) to insert the data 
     $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?"); 

     #Execute the insert 
     $sth->execute(array($name,$count,$company)); 

    #Error if can't connect or insert 
    } catch(PDOException $e) { 
     echo 'Error: ' . $e->getMessage(); 
    }#/try 
} 

Soy nuevo en SQL y havnt encontrado una buena manera de hacer esto todavía.

Respuesta

2

REEMPLAZAR INTO debería funcionar bien - también comprueba columnas con restricciones ÚNICAS. Entonces solo necesitaría mark your name column as unique para que REPLACE INTO lo identifique como duplicado.

No he probado este caso de uso particular, pero la documentación parece permitirlo.

+0

Elegí volver a lo que originalmente tenía. Funcionó una vez que marqué mi columna de nombre único. ¡Gracias! – mdance

4

Puede ser mejor que use la sintaxis insert ... on duplicate update para esto, aunque significará pasar algunos parametros adicionales pero puede anular cierta sintaxis problems in the replace into que parece seguir apareciendo.

REPLACE INTO ***** SET name = ?, slideView = ?, company = ? 

podría escribir como:

insert into yourTableName (name, slideView, company) 
    values (:name, :slideView, :company) 
    on duplicate key update set 
     slideView=:$slideView2, company=:company2 

y luego los derechos de ejecución que se hace de esta manera:

$sth->execute(array(':name' => $name, ':slideView' => $count, 
    ':company' => $company, ':slideView2' => $count, ':company2' => $company)); 

el formato anterior usos mencionados Paramaters (que son siempre mucho más fácil de leer/debug) e insertará una nueva fila en la base de datos, o si la columna de la clave única/primaria name ya tiene el valor, luego actualice la fila con el resto de la información.

Tienes que usar parámetros dos veces aquí (aunque slideView y compañía contendrán la misma información) ya que ningún parámetro se puede usar dos veces en una consulta.

+0

Esto parece correcto. Aunque arroja este error: 'Error: SQLSTATE [42000]: error de sintaxis o violación de acceso: 1064 Tiene un error en su sintaxis de SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'SET slideView = NULL, company = NULL' en la línea 1' – mdance

+0

Además, estoy ejecutando la versión de MySQL '5.1.61' – mdance

+0

Quité' SET' y la consulta se ejecutó, aunque no actualizó nada, simplemente siguió agregando nuevas filas cada vez. – mdance

Cuestiones relacionadas