Curso de MySQL
Consultas, lista de correo 'C++ Con Clase' 'MySQL Con Clase' página de entrada Tabla de contenido Contactar con Webmaster
Curso Sentencias Funciones API C

SQL

Sentencias

ALTER TABLE ANALYZE TABLE BACKUP TABLE BEGIN BEGIN WORK CHECK TABLE CHECKSUM TABLE COMMIT CREATE DATABASE CREATE TABLE CREATE USER DELETE DESCRIBE DO DROP DATABASE DROP INDEX DROP TABLE DROP USER FLUSH GRANT HANDLER INSERT INSERT ... SELECT INSERT DELAYED JOIN KILL LOAD DATA LOCK TABLES OPTIMIZE TABLE RENAME TABLE REPAIR TABLE RESET REVOKE ROLLBACK SELECT SET SET TRANSACTION SHOW SHOW CHARACTER SET SHOW COLLATION SHOW COLUMNS SHOW CREATE DATABASE SHOW CREATE TABLE SHOW CREATE VIEW SHOW DATABASES SHOW ENGINES SHOW ERRORS SHOW GRANTS SHOW INDEX SHOW INNODB STATUS SHOW KEYS SHOW LOGS SHOW PRIVILEGES SHOW PROCESSLIST SHOW STATUS SHOW TABLE STATUS SHOW TABLES SHOW VARIABLES SHOW WARNINGS START TRANSACTION TRUNCATE UNION UNLOCK TABLES UPDATE USE

REPLACE

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...

O:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...

O:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...

REPLACE trabaja exactamente igual que INSERT, excepto que si existe algún registro viejo en la tabla que tenga el mismo valor que uno nuevo para un índice PRIMARY KEY o UNIQUE, el viejo se borra antes de que el nuevo sea insertado.

Hay que tener en cuenta que salvo que la tabla tenga una PRIMARY KEY o un índice UNIQUE, usar una sentencia REPLACE no tiene sentido. En ese caso es equivalente usar una sentencia INSERT, ya que no hay ningún índice que se pueda usar para determinar si una nueva fila duplica a otra.

Los valores para todas las columnas se toman de los valores especificados en la sentencia REPLACE. A cualquier columna perdida se le asigna su valor por defecto, justo lo mismo que ocurre con INSERT. No es posible referirse a los valores de la columna vieja y usarlos en la nueva. Podría parecer que era posible hacerlo en algunas versiones anteriores de MySQL, pero se trataba de un error que ha sido corregido.

Para poder usar REPLACE, se deben poseer los privilegios INSERT y DELETE para la tabla.

La sentencias REPLACE devuelve un contador para indicar el número de filas afectadas. Ese número es la suma de filas borradas e insertadas. Si el contador es 1 para un REPLACE de una única fila, la fila fue insertada y no se borró ninguna fila. Si el contador es mayor de 1, una o más de las viejas filas fue borrada antes de que la nueva fila fuese insertada. Es posible que una única fila reemplace a más de una fila vieja si la tabla contiene varios índices únicos y la nueva fila duplica valores de diferentes filas viejas en diferentes índices únicos.

El contador de filas afectadas hace sencillo determinar si REPLACE sólo ha añadido una fila o si ha reemplazado alguna fila: Compronar si el contador es 1 (añadida) o mayor (reeplazada).

Si se está usando el API C, el contador de filas afectadas se puede obtener usando la función mysql_affected_rows().

Actualmente, no es posible reemplazar en una tabla y seleccionar de la misma tabla en una subconsulta.

A continuación se muestra con más detalle el algoritmo que se usa (también se usa con LOAD DATA ... REPLACE):

  1. Intenta insertar la nueva fila en la tabla.
  2. Mientras la inserción falle porque ocurra un error de clave duplicada para una clave primaria o única:
    1. Borrar de la tabla la fila conflictiva que que tenga el valor de clave duplicado.
    2. Intentar la inserción de la nueva fila en la tabla otra vez.

(4.1.1)