Conoce SQL – Restricciones – PRIMARY KEY

1 – C: Restricción PRIMARY KEY

Algo que toda tabla de base de datos relacional tiene que tener es una clave primaria (primary key). En muchas ocasiones he visto que se simulan esas claves primarias desde php. Como siempre digo, esto es menos eficiente y todo eso pero sobre todo es mucho menos seguro. Los motivos son los de siempre, desde php (y suponiendo que no falle) no deberían de poder meter nuevas filas pero ya sea por un bug en el script o que se use otra aplicación se podrían insertar filas con identificadores repetidos.

La clave primaria es una o varias columnas que son únicas en toda la tabla y que además no puede ser nulo. Prácticamente es como juntar unique y not null (por eso expliqué antes las otras dos). Es importante decidir una buena clave primaria que garantice una buena relación entre las tablas ya que de esta manera podremos realizar consultas muy complejas sin tener que comernos la cabeza. Con esto me refiero a que no es un buen hábito ponerle id_cosa en todas las tablas. Lo ideal es que “compartan” claves de los elementos relacionados.

Otro elemento a tener en cuenta es que mediante las claves primarias podemos perder o ganar mucha eficiencia a la hora de ejecutar consultas. Es importante evitar dentro de todo lo posible claves de tipo VARCHAR precisamente porque un varchar es de tamaño variable y eso le va hacer currar bastante más al SGDB (sistema gestor de bases de datos). Lo ideal es usar datos numericos enteros (INT en caso de mysql) o alfanuméricos de tamaño estático CHAR.

Un ejemplo:

CREATE TABLE usuarios (
id_usuario INT AUTO_INCREMENT,
nombre VARCHAR(25),
CONSTRAINT usuarios_pk PRIMARY KEY (id_usuario)
)

La restricción se crea igual que las demás, solo que especificando que es PRIMARY KEY.

Además, como uso el tipo de dato INT puedo asegurarme que al insertar una nueva fila se genere automáticamente la clave primaria con AUTO_INCREMENT así ejecutando las siguientes consulta:

insert into usuarios (nombre) values (‘Prueba’);
insert into usuarios (nombre) values (‘Usuario’);

No especificamos ninguna clave pero mysql va sumando 1 al id_usuario, quitándonos el trabajo que supone hacerlo desde php. Por ejemplo he visto por ahi esto:

$sql=”SELECT * FROM usuarios”;
$res=mysql_query($sql);
while($fila=mysql_fetch_array($res))
{
$clave=$fila[‘id’];
}
mysql_query(“insert into usuarios (id_usuario,nombre) values (“.$clave.”,'”.$_POST[‘usuario’].”‘)”);

Esto es una total aberración. No solo porque se tocan todos los usuarios, también porque se piden TODOS los datos de cada uno (por el *). Aprovecho para decir que es importante extraer solo los datos necesarios. En este caso, SELECT id FROM usuarios.

Ahora mi intención es solo dar a conocer esta restricción, más adelante  diré como usarlas para crear consultas chachis.

You may also like...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *