You are on page 1of 19

Crear una base de datos

Cada conjunto de relaciones que componen un modelo completo forma una base de datos. Desde el punto de vista de SQL, una base de datos es slo un conjunto de relaciones (o tablas), y para organizarlas o distinguirlas se accede a ellas mediante su nombre. A nivel de sistema operativo, cada base de datos se guarda en un directorio diferente. Debido a esto, crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla, la base de datos estar vaca, es decir, no contendr ninguna tabla. Vamos a crear y manipular nuestra propia base de datos, al tiempo que nos familiarizamos con la forma de trabajar de MySQL. Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "prueba". Para crear una base de datos se usa una sentencia CREATE DATABASE:
mysql> CREATE DATABASE prueba; Query OK, 1 row affected (0.03 sec) mysql>

Podemos averiguar cuntas bases de datos existen en nuestro sistema usando la sentencia SHOW DATABASES:
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | mysql | | prueba | | test | +--------------------+ 3 rows in set (0.00 sec) mysql>

A partir de ahora, en los prximos captulos, trabajaremos con esta base de datos, por lo tanto la seleccionaremos como base de datos por defecto. Esto nos permitir obviar el nombre de la base de datos en consultas. Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino ms bien de una opcin de MySQL:

mysql> USE prueba; Database changed mysql>

Crear una tabla


^

Veamos ahora la sentencia CREATE TABLE que sirve para crear tablas. La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas posibilidades diferentes a la hora de crear una tabla. Las iremos viendo paso a paso, y en poco tiempo sabremos usar muchas de sus posibilidades. En su forma ms simple, la sentencia CREATE TABLE crear una tabla con las columnas que indiquemos. Crearemos, como ejemplo, una tabla que nos permitir almacenar nombres de personas y sus fechas de nacimiento. Deberemos indicar el nombre de la tabla y los nombres y tipos de las columnas:
mysql> USE prueba Database changed mysql> CREATE TABLE gente (nombre VARCHAR(40), fecha DATE); Query OK, 0 rows affected (0.53 sec) mysql>

Hemos creado una tabla llamada "gente" con dos columnas: "nombre" que puede contener cadenas de hasta 40 caracteres y "fecha" de tipo fecha. Podemos consultar cuntas tablas y qu nombres tienen en una base de datos, usando la sentencia SHOW TABLES:
mysql> SHOW TABLES; +------------------+ | Tables_in_prueba | +------------------+ | gente | +------------------+ 1 row in set (0.01 sec) mysql>

Pero tenemos muchas ms opciones a la hora de definir columnas. Adems del tipo y el nombre, podemos definir valores por defecto, permitir o no que contengan valores nulos, crear una clave primaria, indexar... La sintaxis para definir columnas es:
nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia]

Veamos cada una de las opciones por separado.


Valores nulos

Al definir cada columna podemos decidir si podr o no contener valores nulos. Debemos recordar que, como vimos en los captulos de modelado, aquellas columnas que son o forman parte de una clave primaria no pueden contener valores nulos. Veremos que, si definimos una columna como clave primaria, automticamente se impide que pueda contener valores nulos, pero este no es el nico caso en que puede ser interesante impedir la asignacin de valores nulos para una columna. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo:
mysql> CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion INT NULL); Query OK, 0 rows affected (0.98 sec) Valores por defecto

Para cada columna tambin se puede definir, opcionalmente, un valor por defecto. El valor por defecto se asignar de forma automtica a una columna cuando no se especifique un valor determinado al aadir filas. Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usar NULL como valor por defecto. En el ejemplo anterior, el valor por defecto para poblacion es NULL. Por ejemplo, si queremos que el valor por defecto para poblacion sea 5000, podemos crear la tabla como:
mysql> CREATE TABLE ciudad2 (nombre CHAR(20) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.09 sec) Claves primarias

Tambin se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY. Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explcita, MySQL lo har de forma automtica. Por ejemplo, si queremos crear un ndice en la columna nombre de la tabla de ciudades, crearemos la tabla as:
mysql> CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec)

Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Personalmente, prefiero usar la primera forma o la segunda. Existe una sintaxis alternativa para crear claves primarias, que en general es preferible, ya que es ms potente. De hecho, la que hemos explicado es un alias para la forma general, que no admite todas las funciones (como por ejemplo, crear claves primarias sobre varias columnas). Veremos esta otra alternativa un poco ms abajo.
Columnas autoincrementadas En MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna slo puede ser de tipo entero.

Si al insertar una fila se omite el valor de la columna autoinrementada o si se inserta un valor nulo para esa columna, su valor se calcula automticamente, tomando el valor ms alto de esa columna y sumndole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor nico para cada fila de la tabla. Generalmente, estas columnas se usan como claves primarias 'artificiales'. MySQL est optimizado para usar valores enteros como claves primarias, de modo que la combinacin de clave primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:
mysql> CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY, -> nombre CHAR(20) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec) mysql> Comentarios

Adicionalmente, al crear la tabla, podemos aadir un comentario a cada columna. Este comentario sirve como informacin adicional sobre alguna caracterstica especial de la columna, y entra en el apartado de documentacin de la base de datos:
mysql> CREATE TABLE ciudad6 -> (clave INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Clave principal', -> nombre CHAR(50) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec)

Crear una tabla


La creacin de la base de datos ha sido una tarea sencilla, pero hasta ahora permanece vaca, como le muestraSHOW TABLES:
mysql> SHOW TABLES; Empty set (0.00 sec)

La parte difcil es decidir cmo debera ser la estructura de su base de datos: qu tablas necesitar, y qu columnas habr en cada tabla. Querr una tabla para contener un registro por cada mascota. Esta tabla puede llamarse pet, y debera contener, como mnimo, el nombre de cada animal. Dado que el nombre no es muy relevante por s mismo, tendra que tener ms informacin. Por ejemplo, si ms de una persona en su familia tendr mascotas, querr listar tambin el dueo de cada animal. Y algunos otros datos descriptivos bsicos, como especie y sexo. Qu hacer con la edad? Podra ser de inters, pero no es un buen dato para almacenar en una base de datos. La edad cambia a medida que pasa el tiempo, lo cual significa que debera actualizar la base de datos a menudo. En lugar de esto, es mejor almacenar un valor fijo, como la fecha de nacimiento. De este modo, cada vez que requiera saber la edad, podr calcularla como la diferencia entre la fecha de nacimiento y la fecha actual. MySQL provee funciones para realizar

clculos con fechas, por lo que no es dificultoso. Almacenar la fecha de nacimiento en lugar de la edad tiene otras ventajas:

Puede usar la base de datos para tareas como generar recordatorios para los prximos cumpleaos de mascotas. (Si piensa que este tipo de consultas no es importante, considere que es lo mismo que hara en un contexto de base de datos de negocios para identificar aquellos clientes a los que habr que enviar una tarjeta por su cumpleaos, para conseguir ese toque personal con la asistencia del ordenador).

Puede calcular edades en relacin a otras fechas adems de la actual. Por ejemplo, almacenar la fecha de muerte de una mascota le posibilita calcular la edad que tena a ese momento.

Probablemente pensar en otros tipos de informacin que resultaran tiles dentro de la tabla pet pero los identificados hasta ahora son suficientes: name (nombre), owner (propietario), species (especie), sex (sexo), birth (nacimiento) y death (muerte). Debe usar la sentencia CREATE TABLE para especificar la estructura de una tabla:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

El tipo de dato VARCHAR es una buena eleccin para las columnas name, owner, y species porque los datos que all se almacenan no son de longitud uniforme. En realidad no es necesario que todas estas columnas tengan la misma longitud ni que sta sea 20. En MySQL 5.0.3 y versiones posteriores, normalmente se puede adoptar cualquier longitud entre 1 y 65535, segn lo que se crea ms razonable. (Nota: Anteriormente a MySQL 5.0.3, el lmite de longitud era 255.) Si en el futuro debiera aumentar la longitud de estos campos, MySQL tiene la sentencia ALTER
TABLE.

Hay varios tipos de datos que podran usarse para representar el sexo en los registros de animales, tal como 'm'y 'f', o 'male' (masculino) y 'female' (femenino). Lo ms simple es usar los caracteres 'm' y 'f'.

Es obvio el uso del tipo de dato DATE para las columnas birth y death. Luego de crear una tabla, SHOW TABLES debera producir una salida:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+

Para verificar que la tabla ha sido creada en la forma esperada, utilice la sentencia DESCRIBE:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | name | owner | sex | birth | death | Type | Null | Key | Default | Extra | | | | | | | | NULL | NULL | NULL | NULL | NULL | NULL | | | | | | | | | | | | +---------+-------------+------+-----+---------+-------+ | varchar(20) | YES | varchar(20) | YES | char(1) | date | date | YES | YES | YES

| species | varchar(20) | YES

+---------+-------------+------+-----+---------+-------+ DESCRIBE puede ser utilizada en cualquier momento, por ejemplo, si olvida los

nombres o el tipo de dato de las columnas de la tabla.

Sintaxis de DELETE
Sintaxis para una tabla:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]

Sintaxis para mltiples tablas:


DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]

FROM table_references [WHERE where_definition]

O:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*] ...] USING table_references [WHERE where_definition] DELETE borra los registros de tbl_name que satisfacen la condicin dada

por where_definition, y retorna el nmero de registros borrados. Si realiza un comando DELETE sin clusula WHERE se borran todos los registros. Una forma ms rpida de hacerlo, cuando no quiere saber el nmero de registros borrados, se usa TRUNCATE TABLE. Consulte Seccin 13.2.9, Sintaxis de TRUNCATE. Si borra el registro conteniendo el mximo valor para una columna AUTO_INCREMENT , el valor se resa para una tabla BDB , pero no para tablas MyISAM o InnoDB . Si borra todos los registros en la tabla con DELETE
FROMtbl_name (sin clusula WHERE ) en modo AUTOCOMMIT , la secuencia

comienza para todos los tipos de tabla excepto para InnoDB y MyISAM. Hay algunas excepciones para este comportamiento para tablas InnoDB , como se discute en Seccin 15.6.3, Cmo funciona una columna AUTO_INCREMENT en InnoDB. Para tablas MyISAM y BDB , puede especificar una columna AUTO_INCREMENT secundaria en una clave de mltiples columnas. En este caso, el reso de valores borrados del inicio de la secuencia se realiza incluso para tablas MyISAM . Consulte Seccin 3.6.9, Utilizacin de AUTO_INCREMENT. El comando DELETE soporta los siguientes modificadores:

Si especifica LOW_PRIORITY, la ejecucin de DELETE se retarda hasta que no hay ms clientes leyendo de la tabla.

Para tablas MyISAM , si usa la palabra QUICK , el motor de almacenamiento no mezcla las hojas del ndice durante el borrado, que puede acelerar algunos tipos de operaciones de borrado.

En MySQL 5.0, la palabra clave IGNORE hace que MySQL ignore todos los errores durante el proceso de borrar registros. (Los errores encontrados durante la etapa de parseo se procesan de la forma habitual.) Los errores que se ignoran debido al uso de esta opcin se retornan como advertencias.

La velocidad de las operaciones de borrado pueden verse afectadas por factores discutidos en Seccin 7.2.16, Velocidad de sentencias DELETE. En tablas MyISAM , los registros borrados se mantienen en una lista enlazada y las operaciones INSERTsiguientes resan antiguas posiciones de registro. Para reclamar espacio no usado y reducir tamao de fichero, use el comando OPTIMIZE
TABLE o la utilidad myisamchk para reorganizar las tablas. OPTIMIZE TABLE es

ms sencillo, pero myisamchk es ms rpido. Consulte Seccin 13.5.2.5, Sintaxis de OPTIMIZE TABLE ySeccin 5.8.3.10, Optimizacin de tablas. El modificador QUICK afecta si las hojas del ndice es mezclan en operaciones de borrado. DELETE QUICK es ms til para aplicaciones en que los valores del ndice para registros borrados se replazan con valores similares de registros insertados posteriormente. En este caso, los agujeros dejados por los valores borrados se resan.
DELETE QUICK no es til cuando los valores borrados conducen a bloques de

ndices no rellenos con un rango de valores ndice para el que vuelven a ocurrir nuevas inserciones. En este caso, el uso de QUICK puede conducir a un gasto de espacio que queda sin reclamar. Aqu hay un ejemplo de este escenario: 1. Cree una tabla que contenga una columna AUTO_INCREMENT indexada. 2. Inserta varios registros en la tabla. Cada insercin resulta en un valor ndice que se aade al final del ndice. 3. Borra un bloque de registros al final del rango de la columna usando DELETE
QUICK.

En este escenario, los bloques de ndice asociados con los valores de ndice borrado quedan sin rellenar pero no se mezclan con otros bloques de ndice debido al uso de QUICK. Quedan sin rellenar cuando hay nuevas inserciones, ya que los nuevos registros no tienen valores ndice en el rango borrado. Adems, quedan sin rellenar incluso si luego usa DELETE sin QUICK, a no ser que algunos de los valores de ndice borrados estn en los bloques de ndice dentro o adyacentes a los bloques no rellenos. Para reclamar el espacio de ndice sin usar bajo estas circunstancias use OPTIMIZE TABLE. Si va a borrar varios registros de una tabla, puede ser ms sencillo usar DELETE
QUICK seguido por OPTIMIZE TABLE. Esto reconstruye el ndice en lugar de

realizar varias operaciones de mezcla de bloques de ndice. La opcin de MySQL LIMIT row_count para DELETE le dice al servidor el mximo nmero de registros a borrar antes de retornar el control al cliente. Esto puede usarse para asegurar que un comando DELETE especfico no tarada demasiado tiempo. Puede simplemente repetir el comando DELETE hasta que el nmero de registros afectados sea menor que el valor LIMIT . Si el comando DELETE incluye una clusula ORDER BY , los registros se borran en el orden especificado por la clusula. Esto es muy til slo en conjuncin con LIMIT. Por ejemplo, el siguiente ejemplo encuentra registros coincidentes con la clusula WHERE ordenados por timestamp_column, y borra el primero (el ms viejo).
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;

Puede especificar mltiples tablas en un comando DELETE para borrar registros de una o ms tablas dependiendo de una condicin particular en mltiples tablas. Sin embargo, no puede usar ORDER BY o LIMIT en un DELETE de mltiples tablas. La parte table_references lista las tablas involucradas en el join. Esta sintaxis se describe enSeccin 13.2.7.1, Sintaxis de JOIN.

Para la primera sintaxis, slo los registros coincidentes de las tablas listadas antes de la clusula FROM se borran. Para la segunda sintaxis, slo los registros coincidentes de las tablas listadas en la clusula FROM (antes de la clusula USING ) se borran. El efecto es que puede borrar registros para varias tablas al mismo tiempo y tienen tablas adicionales que se usan para buscar:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

O:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

Estos comandos usan las tres tablas al buscar registros a borrar, pero borrar los registros coincidentes slo para las tablas t1 y t2. Los ejemplos anteriores muestran inner joins usando el operador coma, pero comandos DELETE de varias tablas pueden usar cualquier tipo de join permitido por comandos SELECT tales como LEFT JOIN.
Insertar registros

Sintaxis de INSERT
[+/-]

13.2.4.1. Sintaxis de INSERT ... SELECT 13.2.4.2. Sintaxis de INSERT DELAYED


INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

O:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] INSERT inserta nuevos registros en una tabla existente. Las formas INSERT ... VALUES y INSERT ... SET del comando insertan registros basados en valores

explcitamente especificados. La forma INSERT ... SELECTinserta registros seleccionados de otra tabla o tablas. INSERT ... SELECT se discute en Seccin 13.2.4.1, Sintaxis de INSERT ... SELECT.
tbl_name es la tabla en que los registros deben insertarse. Las columnas para las

que el comando proporciona valores pueden especificarse como sigue:

La lista de nombres de columna o la clusula SET indican las columnas explcitamente.

Si no especifica la lista de columnas para INSERT ... VALUES o INSERT ...


SELECT, los valores para cada columna en la tabla deben proporcionarse en la

lista VALUES o por el SELECT. Si no sabe el orden de las columnas en la tabla, use DESCRIBE tbl_name para encontrarlo. Los valores de columna pueden darse de distintos modos:

Si no est ejecutando el modo estricto, cualquier columna que no tenga un valor asignado explcitamente recibe su valor por defecto (explcito o implcito). Por ejemplo, si especifica una lista de columnas que no nombra todas las columnas en la tabla, las no nombradas reciben sus valores por defecto. Los valores por defecto asignados se describen en Seccin 13.1.5, Sintaxis de CREATE TABLE. Consulte Seccin 1.7.6.2, Restricciones (constraints) sobre datos invlidos. Si quiere que un comando INSERT genere un error a no ser que especifique explcitamente valores para todas las columnas que no tienen un valor por defecto, debe usar modo STRICT . Consulte Seccin 5.3.2, El modo SQL del servidor.

Use DEFAULT para asignar a una columna explcitamente su valor por defecto. Esto hace ms fcil escribir comandos INSERT que asignan valores a todas las

columnas excepto unas pocoas, ya que le permite evitar la escritura de una lista de valores VALUES incompleta. De otro modo, tendra que escribir la lista de los nombres de columna correspondientes a cada valor en la lista VALUES . En MySQL 5.0, puede usar DEFAULT(col_name) como forma ms general que puede usarse en expresiones para producir un valor por defecto de una columna.

Si la lista de columnas y la lista VALUES estn vacas, INSERT crea un registro con cada conjunto de columnas con sus valores por defecto:
mysql> INSERT INTO tbl_name () VALUES();

En modo STRICT obtendr un error si una columna no tiene un valor por defecto. De otro modo, MySQL usar el valor implcito para cualquier columna sin un valor explcito por defecto definido.

Puede especificar una expresin expr para proporcionar un valor de columna. Esto puede involucar convesin de tipos si el tipo de la expresin no coincide con el tipo de la columna, y la conversin de un valor dado puede resultar en distintos valores insertados dependiendo del tipo de columna. Por ejmplo, insertar la cadena'1999.0e-2' en una columna INT, FLOAT, DECIMAL(10,6), o YEAR resulta en los valores 1999, 19.9921,19.992100, y 1999 insertados, respectivamente. La razn de que el valor almacenado en las columnas INT yYEAR sea 1999 es que la conversin cadena-a-entero consulta slo el trozo de la parte inicial de la cadena que se puede considerar como un entero vlido o ao. Para las columnas de coma flotante o punto fijo, la conversin cadena-a-coma-flotante considera la cadena entera un valor vlido. Una expresin expr puede referirse a cualquier columna que se haya asignado antes en una lista de valores. Por ejemplo, puede hacer esto porque el valor para col2 se refiere a col1, que se ha asignado prviamente:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

Pero lo siguiente no es legal, ya que el valor para col1 se refiere a col2, que se asigna tras col1:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

Una excepcin involucra a columnas que contienen valores AUTO_INCREMENT . Como el valor AUTO_INCREMENTse genera tras otras asignaciones de valores, cualquier referencia a una columna AUTO_INCREMENT en la asignacin retorna un 0. El comando INSERT soporta los siguientes modificadores:

Si usa la palabra DELAYED, el servidor pone el registro o registros a ser insertados en un bffer, y el cliente realizando el comando INSERT
DELAYED puede continuar. Si la tabla est en uso, el servidor trata los registros.

Cuando la tabla se libera, el servidor comienza a insertar registros, chequeando peridicamente para ver si hay alguna peticin de lectura para la tabla. Si la hay, la cola de registros retardados se suspende hasta que la tabla se libera de nuevo. Consulte Seccin 13.2.4.2, Sintaxis de INSERT DELAYED.

Si usa la palabra LOW_PRIORITY , la ejecucin de INSERT se retrasa hasta que no hay otros clientes leyendo de la tabla. Esto incluye a otros clientes que comiencen a leer mientras que los clientes existentes estn leyendo, y meintras el comando INSERT LOW_PRIORITY est en espera. Es posible, por lo tanto, para un cliente que realice un comando INSERT LOW_PRIORITY esperar durante mucho tiempo (o incluso para siempre) en un entorno de muchas lecturas. (Esto es un contraste de INSERT DELAYED, que deja al cliente continuar. ConsulteSeccin 13.2.4.2, Sintaxis de INSERT DELAYED.) Tenga en cuenta que LOW_PRIORITY no debe usarse normalmente con tablas MyISAM y que hacerlo deshabilita inserciones concurrentes. Consulte Seccin 14.1, El motor de almacenamiento MyISAM.

Si especifica HIGH_PRIORITY, deshabilita el efecto de la opcin --lowpriority-updates si el servidor se arranc con esa opcin. Hace que las

insecionces concurrentes no se usen.

Los valores afectados por un INSERT pueden usarse usando la funcin mysql_affected_rows() de la API de C. Consulte Seccin 24.2.3.1, mysql_affected_rows().

Si usa la palabra IGNORE en un comando INSERT , los errores que ocurren mientras se ejecuta el comando se tratan como advertencias. Por ejemplo, sin IGNORE, un registro que duplique un ndice UNIQUE existente o valorPRIMARY KEY en la tabla hace que un error de clave duplicada en el comando se aborte. Con IGNORE, el registro todava no se inserta, pero no se muestra error. Las conversionse de datos dispararan errores y abortaran el comando si no se sepecificara IGNORE . Con IGNORE, los valores invlidaos se ajustan al valor ms cercano y se insertan; las advertencias se producen pero el comando no se aborta. Puede determinar con la funcin mysql_info() de la API de C cuntos registros se insertan realmente en la tabla.

Si especifica ON DUPLICATE KEY UPDATE, y se inserta un registro que duplicara un valor en un ndice UNIQUE oPRIMARY KEY, se realiza un UPDATE del antiguo registro. Por ejemplo, si la columna a se declara como UNIQUE y contiene el valor 1, los siguientes dos comandos tienen efectos idnticos:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; mysql> UPDATE table SET c=c+1 WHERE a=1;

El valor de registros afectados es 1 si el registros se inserta como un nuevo registro y 2 si un valor existente se actualiza. Nota: Si la columna b es nica, el INSERT sera equivalente a este comando UPDATE :
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

Si a=1 OR b=2 se cumple para varios registros, slo un registro se actualiza. En general, debera intentar evitar usar una clusula ON DUPLICATE KEY en tablas con claves nicas mltiples. MySQL 5.0 permite el uso de la funcin VALUES(col_name) en la clusula UPDATE que se refiere a los valores de columna de la porcin INSERT del comando INSERT ... UPDATE . En otras palabras, VALUES(col_name) en la clusula UPDATE se refiere al valor de col_name que se insertaran, no ocurre conflicto de clave duplicada. Esta funcin es especialmente til en inserciones de

mltiples registros. La funcin VALUES() tiene sentido slo en comandos INSERT


... UPDATE y retorna NULL de otro modo.

Ejemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

Este comando es idntico a los siguientes dos comandos:


mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=3; mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) -> ON DUPLICATE KEY UPDATE c=9;

Cuando usa ON DUPLICATE KEY UPDATE, la opcin DELAYED se ignora. Puede encontrar el valor usado para una columna AUTO_INCREMENT usando la funcin SQL LAST_INSERT_ID(). Desde la API C, use la funcin mysql_insert_id() . Sin embargo, debe tener en cuenta que las dos funciones no siempre se comportan idnticamente. El comportamiento de comandos INSERT respecto a columnasAUTO_INCREMENT se discute en Seccin 12.9.3, Funciones de informacin y Seccin 24.2.3.34, mysql_insert_id(). Si usa un comando INSERT ... VALUES con listas de mltiples valores o INSERT
... SELECT, el comando retorna una cadena de informacin en este formato: Records: 100 Duplicates: 0 Warnings: 0 Records indica el nmero de registros procesados por el comando. (Este no es

necesariamente el nmero de registros realmente insertados, ya que Duplicates puede ser distinto a cero.) Duplicates indica el nmero de registros que no pueden insertarse ya que duplicaran algunos valores de ndice nicos existentes Warningsindicata el nmero de intentos para insertar valores de columna que fueron problemticos por algo. Las advertencias pueden ocurrir bajo cualquiera de las siguientes condiciones:

Insertar NULL en una columna que se ha declarado NOT NULL. Para comandos INSERT de mltiples columnas o comandos INSERT INTO...
SELECT, la columna se asigna con el valor por defecto para el tipo de datos de

la columna. Este es 0 para tipos numricos, la cadena vaca ('') para tipos de cadenas, y el valor cero para tipos de fecha y hora. Los comandos INSERT
INTO ... SELECT se tratan del mismo modo que inserciones de mltiples

registros porque el servidor no examina el resultado del SELECT para ver si retorna o no un nico registro. (para un nico registro INSERT, no hay ninguna advertencia cuando NULL se inserta en una columnaNOT NULL . En lugar de eso, el comando falla con un error.)

Poner en una columna numrica un valor fuera del rango de la columna. El valor se redondea al punto final del rango ms cercano.

Asigne un valor tal como '10.34 a' a una columna numrica. El texto final se elimina y la parte numrica se inserta. Si el valor de cadena no tiene parte inicial numrica, la columna se pone a 0.

Insertar una cadena en una columna de cadena (CHAR, VARCHAR, TEXT, o BLOB) que excede la maxima longitud de la columna. El valor se trunca a la mxima longitud de la columna.

Insertar un valor en una columna de fecha u hora que es ilegal para el tipo de la columna. La columna se asigna con el valor cero apropiado para el tipo.

Visualizar tablas:

Obtener informacin sobre bases de datos y tablas


Qu tal si no se recuerda el nombre de una base de datos o una tabla, o cmo es su estructura (por ejemplo, nombres de columnas)? MySQL aborda este problema a travs de varias sentencias que proveen informacin acerca de las bases de datos y tablas que soporta. Ya se ha visto SHOW DATABASES, la cual informa las bases de datos gestionadas por el servidor. Para conocer la base de datos actualmente seleccionada, se utiliza la funcion DATABASE():
mysql> SELECT DATABASE();

+------------+ | DATABASE() | +------------+ | menagerie | +------------+

Si an no se hubiese seleccionado ninguna base de datos, el resultado sera NULL. Para conocer las tablas contenidas en la base de datos actual (por ejemplo, si no se est seguro del nombre de una tabla) se usa el siguiente comando:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | pet | |

+---------------------+

Si lo que se desea es ver la estructura de una tabla, el comando DESCRIBE es til; muestra informacin acerca de cada columna de la tabla:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | name | owner | sex | birth | death | Type | Null | Key | Default | Extra | | | | | | | | NULL | NULL | NULL | NULL | NULL | NULL | | | | | | | | | | | | +---------+-------------+------+-----+---------+-------+ | varchar(20) | YES | varchar(20) | YES | char(1) | date | date | YES | YES | YES

| species | varchar(20) | YES

+---------+-------------+------+-----+---------+-------+ Field contiene el nombre de la columna, Type es el tipo de dato, NULL seala si la

columna puede contener valores NULL, Key indica si la columna est indexada, y Default informa el valor por defecto de la columna. Si una tabla tiene ndices, SHOW INDEX FROM tbl_name muestra informacin sobre ellos.

DROP DATABASE -------- borrar base de datos en mysql ejemplo DROP DATABASE farmacia;

You might also like