CONSULTAS en MySQL

* Listados:
     SELECT columnas FROM tabla [WHERE condición]
       [GROUP BY columna [ HAVING condición ]]
       [ORDER BY columna [ ASC | DESC ]]
       [LIMIT [inicio,] num_registros]
     (Se puede usar el comodín * para seleccionar todas las columnas)

   Ejemplos:
     SELECT * FROM City;
     SELECT Name, Population FROM City
       WHERE CountryCode='ESP' AND Population > 500000 LIMIT 0,10;
     SELECT CountryCode, SUM(Population) FROM City
       GROUP BY CountryCode HAVING SUM(Population) > 10000000;
     SELECT City.Name, Country.Name FROM City, Country
       WHERE City.CountryCode=Country.Code ORDER BY Country.Name;

 * Borrado:
     DELETE FROM tabla WHERE condición;

   Ejemplos:
     DELETE FROM City WHERE Name='Marbella';
     DELETE FROM City WHERE CountryCode='ESP' AND Population>500000;

 * Inserción: 
     INSERT INTO tabla (columna1, columna2, ...) VALUES (valor1, valor2, ...);

   Ejemplos:
     INSERT INTO City (Name, CountryCode, District, Population)
       VALUES ('JoanBrossa','ESP', 'Katalonia', 3500000);
     INSERT INTO City SET Name='JoanBrossa', CountryCode='ESP',
       District='Katalonia', Population=3500000;

 * Modificación:
     UPDATE tabla SET columna1=valor1, columna2=valor2, ... [WHERE condición];

   Ejemplos:
     UPDATE City SET Population=5000000 WHERE Name='JoanBrossa';
     UPDATE City SET Population=5000000 WHERE Population>1000000;

 * clausula FROM:
     Especifica la tabla de la cual se seleccionan los registros

 * clausula WHERE:
     Detalla las condiciones que han de reunir los registros resultantes

 * clausula GROUP BY:
     Separa los registros seleccionados en grupos específicos

 * clausula HAVING:
     Expresa la condición que debe cumplir cada grupo

 * clausula ORDER BY:
     Ordena los registros seleccionados de acuerdo a una ordenación específica

 * clausula LIMIT:
     Restringe el número de resultados devueltos.

 * Lecturas para profundizar:
   - http://dev.mysql.com/doc/refman/5.0/es/data-manipulation.html
   - http://dev.mysql.com/doc/refman/5.0/es/examples.html
   - http://dev.mysql.com/doc/refman/5.0/es/query-speed.html

MOTORES DE ALMACENAMIENTO en MySQL

* El servidor MySQL incorpora una característica única llamada “motores de almacenamiento”, que nos permite seleccionar el tipo de almacenamiento interno de cada tabla, en base al que mejor se adecúe a una situación particular. Dicha selección, la hace el desarrollador a nivel de tabla, y no afecta a la manera en que el servidor interactúa con el cliente: los comandos SQL serán los mismos sea cual sea el motor de almacenamiento escogido. El cliente no necesita saber como se guardan los datos. MySQL dispone de una docena de motores de almacenamiento propios, más los motores externos desarrollados por terceras partes que se pueden incorporar al servidor. Algunos de los más conocidos son: MyISAM, InnoDB, HEAP, NDB.
* Seleccionar el motor de almacenamiento de una tabla:
CREATE TABLE nombre_tabla (definición) ENGINE = nombre_motor;
ALTER TABLE nombre_tabla ENGINE = nombre_motor;

Ejemplos:
CREATE TABLE City (…) ENGINE=InnoDB;
ALTER TABLE City ENGINE=MyISAM;

* Caractrísticas del motor MyISAM:
– No transaccional.
– Bloqueos a nivel de tabla.
– Muy rápido en lectura y escritura (excepto escrituras simultaneas en la
misma tabla).
– Bajo requerimiento de espacio en disco y memoria.
– Los datos se guardan en disco: diferentes ficheros para la definición de la
tabla, los datos y los índices.
– Es el motor por defecto de MySQL.
– Es una buena elección cuando necesitamos velocidad, y tenemos pocas
modificaciones simultaneas de la tabla.

* Caractrísticas del motor InnoDB:
– Transaccional.
– Multiversionado: cuando múltiples transacciones modifican registros, InnoDB
mantiene aisladas las transacciones guardando para cada una de ellas
un versión distinta de un mismo registro, a cada transacción la versión que
le corresponde.
– Bloqueos a nivel de registro.
– Restricciones en claves foráneas.
– Fácil recuperación de datos en caso de error.
– Alta concurrencia más segura en escritura.
– Deshacer transacciones a medias (“rollback”).
– Los datos se guardan en disco: un fichero para la definición de la
tabla, y un “tablespace” para guardar conjuntamente datos e índices. El
tablespace puede consistir en uno o más ficheros, o incluso una partición
entera en disco.
– Podemos especificar como crecen los tablespaces en el fichero de
configuracion /etc/mysql/my.cnf. Por ejemplo:
[mysqld]
innodb_data_file_path = ibdata1:100M;ibdata2:100M:autoextend:max:500M
– Necesita mas espacio en disco y memoria que MyISAM para guardar los datos
(unas tres veces mas de espacio en disco, y montones de RAM para las
memorias temporales si queremos conseguir un rendimiento óptimo).
– Es una buena elección cuando necesitamos transacciones, restricciones en
claves foráneas, o tenemos muchas escrituras simultaneas.

* Caractrísticas del motor HEAP:
– Los datos se guardan en memoria, utilizando algoritmos que hacen un uso
óptimo de este medio.
– Es muy, muy rápido.
– Podemos crear una tabla HEAP a partir de una tabla en disco con:
CREATE TABLE nombre_tabla ENGINE=MEMORY SELECT * FROM nombre_tabla_disco;
– Es una buena elección cuando necesitamos realizar operaciones muy rápidas
sobre conjuntos pequeños de datos.

* Caractrísticas del motor NDB:
– Es el motor de almacenamiento de los clúster de MySQL.
– La base de datos esta repartida por los diferentes nodos del clúster.
– Proporciona alta disponibilidad mediante redundancia.
– Proporciona alto rendimiento mediante fragmentación de datos sobre los
grupos de nodos.
– Proporciona alta escalabilidad mediante la combinación de las dos
características anteriores.
– Los datos se guardan en memoria, pero los logs van a disco.
– Es una buena elección cuando disponiendo de varios servidores necesitamos a
la vez velocidad, transacciones y redundancia de datos; replicación
síncrona; y resistencia a caídas de servidores.

* Comparación de los motores:
MyISAM InnoDB HEAP NDB
Multi-statement transactions, ROLLBACK – X – X
Foreign key constraints – X – –
Locking level table row table row
BTREE indexes X X – X
FULLTEXT indexes X – – –
HASH lookups – X X X
Other in-memory tree-based index – – 4.1.0 –
GIS, RTREE indexes 4.1.0 – – –
Unicode 4.1.0 4.1.2 – –
Merge (union views) X – – –
Compress read-only storage X – – –
Relative disk use low high – low
Relative memory use low high low high

* Podemos deshabilitar los motores de almacenamiento que no necesitamos para
ahorrar memoria del servidor, ya que no necesitaremos reservar memoria para
los buffers y otras estructuras de datos asociadas con el motor. Por ejemplo:

shell> mysqld –skip-bdb –skip-innodb

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/storage-engines.html
– http://dev.mysql.com/doc/refman/5.0/es/myisam-storage-engine.html
– http://dev.mysql.com/doc/refman/5.0/es/innodb.html

FUNCIONAMIENTO DEL SERVIDOR MYSQL

* Funcionamiento:
1) Los clientes se conectan a servidor.
2) Los clientes inician autentificación, codifican y envían peticiones,
comprimen y cifran peticiones, cachean los resultados del servidor, …
3) El servidor procesa las peticiones y devuelve las respuestas.
4) Las peticiones son procesadas primero por la capa de manipulación, que las
desencripta, valida su sintaxis, las busca en la caché, y las envía al
correspondiente motor de almacenamiento.
5) Los motores de almacenamiento (MyISAM, InnoDB, Memory, …) manejan la
representación en memoria y disco de bases de datos, tablas e índices, así
como generación de estadísticas y algunos logs.
6) La capa de manejo escribe logs a disco, guarda y lee caches en memoria,
lee logs binarios de la red, … Los motores de almacenamiento guardan
datos (tablas, logs, …) en disco y en memoria, envía datos a otros
servidores remotos, …

* El servidor MySQL utiliza espacio en disco para almacenar lo siguiente:
– Los programas cliente y servidor, y sus librerías.
– Los ficheros de registro (“logs”) y de estado.
– Las bases de datos.
– Los ficheros de formato de tablas (‘*.frm’) para todos los motores de
almacenamiento, y los ficheros de datos y ficheros de índices para algunos
motores de almacenamiento.
– Los ficheros de “tablespaces” de InnoDB, si el motor de almacenamiento
InnoDB está activado.
– Tablas temporales internas que han sobrepasado el límite de tamaño en
memoria y deben ser convertidas a tablas en disco.

* El servidor MySQL utiliza espacio en memoria para almacenar lo siguiente:
– Gestores de conexión (cada conexión consume memoria).
– Buffers que guardan tablas temporales internas que no han sobrepasado el
límite de tamaño en memoria.
– Cachés: caché de hosts, la caché de tablas, la caché de consultas, …
– Una copia de la tabla de permisos.
– El contenido de las tablas HEAP (motor de almacenamiento en memoria). Su
fichero de formato (‘*.frm’) se continua guardando en disco.

* El servidor MySQL utiliza los siguientes buffers por cada cliente:
– Buffers de registros para las búsquedas secuenciales en tablas
(‘read_buffer_size’) y para leer las líneas después de una ordenación
(‘read_rnd_buffer_size’) normalmente conseguida mediante la cláusula ORDER.
– Buffer de join para las uniones de tablas.
– Buffer de ordenación para las operaciones de ordenación.
– Buffer de comunicaciones para intercambiar información con el cliente.
Comienza con un tamaño de ‘net_buffer_length’, pero si es necesario el
servidor aumenta su tamaño al señalado por ‘max_allowed_packet’.

* Los límites que el sistema operativo puede imponer al servidor MySQL son:
– El máximo número de ficheros abiertos por proceso limita el tamaño máximo
de la caché de tablas, que guarda los descriptores de ficheros para los
ficheros de tablas.
– El máximo número de hilos de ejecución por proceso limita el número de
clientes que se pueden conectar simultáneamente al servidor MySQL.
– El ‘backlog’ permitido por el sistema limita el número de conexiones de red
en cola debido a clientes que esperan a conectarse.
– El sistema de ficheros donde se guardan los datos limita el tamaño máximo
del fichero, pero este límite puede esquivarse repartiendo los datos en
varios ficheros.

* Para registrar los errores podemos iniciar el servidor mediante ‘mysqld_safe’.
Para ver los errores debemos buscar un fichero en el directorio de datos con
el nombre de la máquina y con el sufijo ‘.err’.

* Para registrar las modificaciones de datos de las tablas podemos iniciar el
servidor con la opción “–log-bin”. Para ver dicho registro se utiliza la
herramienta ‘mysqlbinlog’.

* Ver la actividad del servidor:
mysql> SHOW STATUS;
shell> mysqladmin extended-status

* Ver la configuración del servidor:
mysql> SHOW VARIABLES;
shell> mysqladmin variables

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/features.html
– http://dev.mysql.com/doc/refman/5.0/es/log-files.html

INSTALACIÓN DE MYSQL 5.0 EN UBUNTU

 * Instalaremos los paquetes 'mysql-server' y 'mysql-client'.

   (Opcionalmente podemos instalar los paquetes 'mysql-admin', que es un
    entorno gráfico de administración, y 'mysql-query-browser', que es un
    entorno gráfico para realizar consultas.)

 * La instalación crea en el sistema el usuario 'mysql' y el grupo 'mysql'.

 * La instalación crea en el servidor de bases de datos el usuario 'root' sin
   contraseña, que tiene control total sobre todas las bases de datos del 
   servidor. Para ponerle contraseña debemos escribir el la línea de comandos:

     mysqladmin -u root password nueva_contraseña

   (En algunas instalaciones también existe un usuario anónimo '' sin 
    contraseña, propietario de la base de datos de prueba 'test'.)

   (En versiones posteriores de Ubuntu, la contraseña del usuario 'root' se 
    solicita en el momento de la instalación.)

   Los usuarios de la base de datos no tienen nada que ver con los usuarios del
   sistema operativo.

 * Por defecto hay una base de datos 'mysql' con información de MySQL y usuarios,
   y otra base de datos 'information_schema' con información de bases de datos.

 * Ficheros y directorios importantes (pueden variar en otras instalaciones):

   - /var/lib/mysql/

     Guarda las bases de datos del servidor.

     A cada base de datos corresponderá un directorio con el mismo nombre.

     A cada tabla MyISAM corresponderán varios ficheros con el mismo nombre que
     la tabla y diferente extensión (*.frm = formato, *.myd = datos tablas, 
     *.myi = índices) dentro de un directorio con el mismo nombre que su base de
     datos.

     A cada tabla InnoDB corresponderán un fichero con el mismo nombre que la
     tabla y extensión .frm (formato) dentro de un directorio con el mismo
     nombre que su base de datos, y varios ficheros con nombre 'ibdata1',
     'ibdata2', ... ("tablespace") que compartirá con otras bases de datos en el
     directorio principal de datos.

     El propietario de los ficheros es el usuario 'mysql' y el grupo 'mysql'.

   - /var/log/mysql/

     Anotaciones y alertas del servidor.

   - /etc/mysql/

     Ficheros de configuración general (my.cnf).
     Cada vez que cambiemos la configuración deberemos reiniciar el servidor
     para que se activen los nuevos cambios.

   - /etc/init.d/mysql

     Script para arrancar, parar y reiniciar el servidor

   - /usr/bin/ , /usr/sbin/ , /usr/share/mysql/

     Programas de MySQL

 * Se puede iniciar la ejecución de varias maneras:

     sudo /etc/init.d/mysql start
     sudo /usr/sbin/mysql start
     sudo /usr/bin/mysqld-multi
     sudo /usr/bin/mysqld-safe

 * Se puede parar la ejecución de varias maneras:

     sudo /etc/init.d/mysql stop
     sudo /usr/sbin/mysql stop
     mysqladmin -u root -p shutdown

 * El puerto por defecto del servidor MySQL es el TCP/UDP 3306.

 * Si quiero acceder remotamente al servidor debo modificar /etc/mysql/my.cnf
   comentar la línea "bind-address" o comentar la línea "skip-networking"

 * Si quiero los mensajes en otro idioma debo modificar /etc/mysql/my.cnf
   y cambiar la línea "[mysqld] language = ". Por ejemplo "laguage = spanish".

 * Lecturas para profundizar:
   - http://dev.mysql.com/doc/refman/5.0/es/server-side-scripts.html
   - http://dev.mysql.com/doc/refman/5.0/es/instance-manager.html
   - http://dev.mysql.com/doc/refman/5.0/es/configuring-mysql.html
   - http://dev.mysql.com/doc/refman/5.0/es/server-shutdown.html
   - http://dev.mysql.com/doc/refman/5.0/es/security.html
   - http://dev.mysql.com/doc/refman/5.0/es/mysql.html
   - http://dev.mysql.com/doc/refman/5.0/es/mysqladmin.html

 

INSTALACIÓN DE LA BASE DE DATOS DE EJEMPLO

 

Para las diferentes pruebas que haremos necesitaremos una base de datos.
Podemos descargar una sencilla base de datos con tres tablas en:

  http://downloads.mysql.com/docs/world.sql.gz

Opcionalmente, también se puede descargar otra base de datos más compleja, con
más tablas, vistas, procedimientos almacenados, triggers, etc. en:

  http://downloads.mysql.com/docs/sakila-db.tar.gz

Para trabajar con la base de datos 'world' haremos lo siguiente:

1) Descomprimirla en nuestra carpeta personal. Obtendremos un fichero 
   'world.sql' con sentencias SQL que al ejecutarlo en el servidor creará las
   tablas de la base de datos.

2) Iniciar el cliente de MySQL:

     mysql [-h dirección_servidor] -p -u usuario base_datos [< fichero_sql]

   En nuestro caso:

     mysql -p -u root

3) Creamos la base de datos y la seleccionamos:

     CREATE DATABASE world;
     USE world;

4) Ejecutamos el fichero 'world.sql':

     SOURCE world.sql;

Fuera del cliente MySQL, desde la cónsola, podemos comprobar que se ha creado
un directorio para la base de datos y los ficheros para las tablas:

  sudo ls -l /var/lib/mysql
  sudo ls -l /var/lib/mysql/world

Funciones del Administrador de Base de Datos

Las funciones de un administrador de bases de datos son:

 * Gestión del software: 

   instalación del software, 
   actualización del software, 
   conexión de programas (por ej. ofimática) con el servidor de bases de datos.

 * Gestión de las bases de datos:

   creación de bases de datos,
   importación y exportación de datos,
   copias de seguridad y recuperación,
   optimización de las tablas,
   análisis de la integridad y reparación.

 * Gestión de los usuarios:

   creación de usuarios y bajas,
   asignación de permisos.

 * Gestión de los recursos:

   monitorización del rendimiento y el tamaño,
   gestión del espacio y asignación de quotas,
   configuración óptima del servidor.

 * Gestión de la seguridad:

   monitorización de los accesos,
   configuración segura del servidor.

mysqli options

(PHP 5)

mysqli_options, mysqli->options — Fija opciones

Descripción

Estilo por procedimientos:

bool mysqli_options ( mysqli $identificador_de_enlace, int $opción, mixto $valor )

Estilo orientado a objetos (método)

class mysqli {
bool options ( int $opción, mixto $valor )
}

mysqli_options() puede ser usada para fijar opciones extra en la conexión y afectar el comportamiento para la conexión.

Esta función puede ser llamada múltiples veces para fijar diferentes opciones.

mysqli_options() debe ser llamada después de mysqli_init() y antes de mysqli_real_connect().

El parámetro opción es la opción que se busca cambiar, el parámetro valor es el valor para la opción. El parámetro opci´on puede ser una de las siguientes:

Opciones validas

Nombre Descripción
MYSQLI_OPT_CONNECT_TIMEOUT Tiempo que espera para ser conectado en segundos
MYSQLI_OPT_LOCAL_INFILE habilita/deshabilita el uso de LOAD LOCAL INFILE
MYSQLI_INIT_CMD comando a ejecutar después cuando se conecte al servidor MySQL
MYSQLI_READ_DEFAULT_FILE Lee las opciones del archivo de configuración específicado en vez demy.cnf
MYSQLI_READ_DEFAULT_GROUP Lee las opciones del grupo del archivomy.cnf o del archivo específicado con MYSQL_READ_DEFAULT_FILE.

Valores retornados

Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.

mysqli num rows

(PHP 5)

mysqli_num_rows — Obtiene el número de filas en un resultado

Descripción

Estilo por procedimientos:

mixto mysqli_num_rows ( mysqli_result $resultado )

Estilo orientado a objetos (propiedad):

class mysqli_result {
mixto num_rows
}

Regresa el número de filas en el resultado.

El uso de mysqli_num_rows() depende de si se usa resultados con almacenamiento intermedio (buffered) o no. En caso de usar resultados sin almacenamiento intermedio, mysqli_num_rows() no dará el número correcto de filas hasta que se hayan obtenido todas las filas del resultado.

Valores retornados

Regresa el número de filas en el resultado.

nota: Si el número de filas es superior al valor entero maximo, el número será regresado como una cadena.

Ver también

mysqli_affected_rows(), mysqli_store_result(), mysqli_use_result(), y mysqli_query().

Ejemplos

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

if ($result = $mysqli->query("SELECT Code, Name FROM Country ORDER BY Name")) {

/* determine number of rows result set */
$row_cnt = $result->num_rows;

printf("Result set has %d rows.\n", $row_cnt);

/* close result set */
$result->close();
}

/* close connection */
$mysqli->close();
?>

Estilo por procedimientos

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

if ($result = mysqli_query($link, "SELECT Code, Name FROM Country ORDER BY Name")) {

/* determine number of rows result set */
$row_cnt = mysqli_num_rows($result);

printf("Result set has %d rows.\n", $row_cnt);

/* close result set */
mysqli_free_result($result);
}

/* close connection */
mysqli_close($link);
?>

El resultado del ejemplo seria:

Result set has 239 rows.

mysqli num fields

(PHP 5)

mysqli_num_fields, result->field_count — Obtiene el número de campos en un resultado Get the number of fields in a result

Descripción

Estilo por procedimientos:

int mysqli_num_fields ( mysqli_result $resultado )

Estilo orientado a objetos (propiedad

class mysqli_result {
int field_count
}

mysqli_num_fields() regresa el número de campos del resultado específicado.

Valores retornados

El númerp de campos en un resultado

Ver también

mysqli_fetch_field().

Ejemplos

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

if ($result = $mysqli->query("SELECT * FROM City ORDER BY ID LIMIT 1")) {

/* determine number of fields in result set */
$field_cnt = $result->field_count;

printf("Result set has %d fields.\n", $field_cnt);

/* close result set */
$result->close();
}

/* close connection */
$mysqli->close();
?>

Estilo por procedimientos

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

if ($result = mysqli_query($link, "SELECT * FROM City ORDER BY ID LIMIT 1")) {

/* determine number of fields in result set */
$field_cnt = mysqli_num_fields($result);

printf("Result set has %d fields.\n", $field_cnt);

/* close result set */
mysqli_free_result($result);
}

/* close connection */
mysqli_close($link);
?>

El resultado del ejemplo seria:

Result set has 5 fields.

mysqli kill

(PHP 5)

mysqli_kill, mysqli->kill — Le pide al servidor “matar” el proceso MySQL

Descripción

Estilo por procedimientos:

bool mysqli_kill ( mysqli $identificador_de_enlace, int $processid )

Estilo orientado a objetos (métod0)

class mysqli {
bool kill ( int $processid )
}

Esta función es usada para pedir al servidor matar le proceso MySQL específicado por el parámetro processid. Este valor debe ser obtenido llamando la función mysqli_thread_id().

nota: Para detenener una consulta que se está ejecutando, debes usar el commando KILL QUERY processid.

Valores retornados

Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.

Ver también

mysqli_thread_id().

Ejemplos

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

/* determine our thread id */
$thread_id = $mysqli->thread_id;

/* Kill connection */
$mysqli->kill($thread_id);

/* This should produce an error */
if (!$mysqli->query("CREATE TABLE myCity LIKE City")) {
printf("Error: %s\n", $mysqli->error);
exit;
}

/* close connection */
$mysqli->close();
?>

Estilo por procedimientos

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

/* determine our thread id */
$thread_id = mysqli_thread_id($link);

/* Kill connection */
mysqli_kill($link, $thread_id);

/* This should produce an error */
if (!mysqli_query($link, "CREATE TABLE myCity LIKE City")) {
printf("Error: %s\n", mysqli_error($link));
exit;
}

/* close connection */
mysqli_close($link);
?>

El resultado del ejemplo seria:

Error: MySQL server has gone away

mysqli insert id

(PHP 5)

mysqli_insert_id, mysqli->insert_id — Regresa el ID generado automáticamente en la última consulta

Descripción

Estilo por procedimientos:

mixto mysqli_insert_id ( mysqli $identificador_de_enlace )

Estilo orientado a objetos (propiedad):

class mysqli {
mixto insert_id
}

La función mysqli_insert_id() regresa el ID generado por una consulta en una tabla con una columna que tiene el atributo AUTO_INCREMENT. Si la última consulta no fue un estatuto INSERT o UPDATE o si la tabla modificada no tiene una columna con este atributo, está función regresará cero.

nota: Ejecuta una sentencia INSERT o UPDATE usando la función LAST_INSERT_ID() también modificará el valor regresado por la función mysqli_insert_id().

Valores retornados

El valor de el campo AUTO_INCREMENT que fue actualizado por la consulta previa. Regresa cero si no hubo una consulta previa en la conexión o si la consulta no actualizo un valor AUTO_INCREMENT.

nota: Si el número es mayor al entero máximo, mysqli_insert_id() regresará una cadena.

Ejemplos

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* drop table */
$mysqli->query("DROP TABLE myCity");

/* close connection */
$mysqli->close();
?>

Estilo por procedimientos

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);

printf ("New Record has id %d.\n", mysqli_insert_id($link));

/* drop table */
mysqli_query($link, "DROP TABLE myCity");

/* close connection */
mysqli_close($link);
?>

El resultado del ejemplo seria:

New Record has id 1.