Sei sulla pagina 1di 12

Clave primaria.

Una clave primaria es un campo (o varios) que identifica 1 solo registro (fila) en una tabla.
Para un valor del campo clave existe solamente 1 registro. Los valores no se repiten ni
pueden ser nulos.
Veamos un ejemplo, si tenemos una tabla con datos de personas, el nmero de
documento puede establecerse como clave primaria, es un valor que no se repite; puede
haber personas con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por
ejemplo), pero su documento ser siempre distinto.

Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave
primaria, es un valor que no se repite; puede haber usuarios con igual clave, pero su
nombre de usuario ser siempre distinto.
Establecemos que un campo sea clave primaria al momento de creacin de la tabla:

create table usuarios (
nombre varchar(20),
clave varchar(10),
primary key(nombre)
);

Para definir un campo como clave primaria agregamos "primary key" luego de la definicin
de todos los campos y entre parntesis colocamos el nombre del campo que queremos
como clave.

Si visualizamos la estructura de la tabla con "describe" vemos que el campo "nombre" es
clave primaria y no acepta valores nulos(ms adelante explicaremos esto
detalladamente).

Ingresamos algunos registros:

insert into usuarios (nombre, clave)
values ('Leonardo','payaso');
insert into usuarios (nombre, clave)
values ('MarioPerez','Marito');
insert into usuarios (nombre, clave)
values ('Marcelo','River');
insert into usuarios (nombre, clave)
values ('Gustavo','River');

Si intentamos ingresar un valor para el campo clave que ya existe, aparece un mensaje
de error indicando que el registro no se carg pues el dato clave existe. Esto sucede
porque los campos definidos como clave primaria no pueden repetirse.

Ingresamos un registro con un nombre de usuario repetido, por ejemplo:
insert into usuarios (nombre, clave)
values ('Gustavo','Boca');

Una tabla slo puede tener una clave primaria. Cualquier campo (de cualquier tipo) puede
ser clave primaria, debe cumplir como requisito, que sus valores no se repitan.

Al establecer una clave primaria estamos indexando la tabla, es decir, creando un ndice
para dicha tabla; a este tema lo veremos ms adelante.


PROBLEMA RESUELTO:

Trabajamos con la tabla "usuarios" que contiene el nombre de usuario y su clave.
Eliminamos la tabla, si existe:
drop table if exists usuarios;

Creamos la tabla:
create table usuarios (
nombre varchar(20),
clave varchar(10),
primary key (nombre)
);

Vemos la estructura de la tabla:
describe usuarios;

Note que en la columna "KEY" del campo "nombre" aparece "PRI", esto significa que ese
campo es clave primaria.
Ingresamos algunos registros:
insert into usuarios (nombre, clave) values ('Leonardo','payaso');
insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
insert into usuarios (nombre, clave) values ('Marcelo','River');
insert into usuarios (nombre, clave) values ('Gustavo','River');

Al intentar ingresar un valor repetido para el campo clave, aparece un mensaje de error
indicando que el registro no se carg pues el dato est duplicado; vemoslo en un
ejemplo, ingresemos un registro con un nombre de usuario repetido:

insert into usuarios (nombre, clave)
values ('Gustavo','Boca');

PROBLEMA PROPUESTO:

Trabaje con la tabla "libros" de una librera.

1- Elimine la tabla si existe.

2- Crela con los siguientes campos y clave: codigo (integer),
titulo (cadena de 20 caracteres de longitud), autor (cadena de 30),
editorial (cadena de 15), codigo ser clave primaria:

3- Visualice la estructura de la tabla "libros", compruebe la clave primaria.

4- Ingrese los siguientes registros:

1,El aleph,Borges,Planeta;
2,Martin Fierro,Jose Hernandez,Emece;
3,Aprenda PHP,Mario Molina,Emece;
4,Cervantes y el quijote,Borges,Paidos;
5,Matematica estas ahi, Paenza, Paidos;

5- Seleccione todos los registros.

6- Ingrese un registro con cdigo no repetido y nombre de autor repetido.

7- Ingrese un registro con cdigo no repetido y ttulo y editorial repetidos.

8- Intente ingresar un registro que repita el campo clave (aparece mensaje de error
por clave repetida).

OTROS PROBLEMAS:

A) Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".

1- Elimine la tabla "clientes" si existe:

2- Crela con los siguientes campos y clave:

create table clientes(
documento varchar(8),
apellido varchar(20),
nombre varchar(20),
domicilio varchar(30),
telefono varchar (11),
primary key(documento)
);

3- Visualice la estructura de la tabla para compruebar la clave primaria
establecida.

4- Ingrese los siguientes registros:
(documento,apellido,nombre,domicilio, telefono)
22345678,Perez,Marcos,Colon 123,4545454
23222222,Garcia,Ana,Avellaneda 1345,4252652
20454545,Lopez,Susana,Urquiza 344,4522525
35454545,Lopez,Susana,Urquiza 344,4522525

Note que hay 2 registros con todos los datos iguales excepto el documento.

6- Ingrese un cliente con cdigo no repetido y apellido y nombre repetido.

7- Ingrese un cliente con cdigo no repetido y domicilio repetido.

8- Intente ingresar un registro con documento repetido
(aparece mensaje de error por clave repetida).


B) Un instituto de enseanza almacena los datos de sus estudiantes
en una tabla llamada "alumnos".

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla con la siguiente estructura:

create table alumnos(
legajo varchar(4) not null,
documento varchar(8) not null,
apellido varchar(30),
nombre varchar(30),
domicilio varchar(30),
primary key (legajo)
);

3- Ingrese los siguientes registros:
(legajo,documento,apellido,nombre,domicilio)
A233,22345345,Perez,Mariana,Colon 234
A567,23545345,Morales,Marcos,Avellaneda 348
B654,24356345,Gonzalez,Analia,Caseros 444
A642,20254125,Torres,Ramiro,Dinamarca 209
B509,20445778,Miranda,Carmen,Uspallata 999
C777,28111444,Figueroa,Natalia,Sarmiento 856

4- Seleccione todos los registros.

5- Ingrese 2 alumnos con igual nombre y apellido pero distinto legajo.

6- Intente ingresar un registro que repita el campo clave ("legajo").
Aparece mensaje de error por clave repetida).


CAMPO ENTERO CON AUTOINCREMENTO.
Un campo de tipo entero puede tener otro atributo extra 'auto_increment'. Los valores de
un campo 'auto_increment', se inician en 1 y se incrementan en 1 automticamente.

Se utiliza generalmente en campos correspondientes a cdigos de identificacin para
generar valores nicos para cada nuevo registro que se inserta.

Slo puede haber un campo "auto_increment" y debe ser clave primaria (o estar
indexado).

Para establecer que un campo autoincremente sus valores automticamente, ste debe
ser entero (integer) y debe ser clave primaria:

create table libros(
codigo int auto_increment,
titulo varchar(20),
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);

Para definir un campo autoincrementable colocamos "auto_increment" luego de la
definicin del campo al crear la tabla.

Hasta ahora, al ingresar registros, colocamos el nombre de todos los campos antes de los
valores; es posible ingresar valores para algunos de los campos de la tabla, pero recuerde
que al ingresar los valores debemos tener en cuenta los campos que detallamos y el
orden en que lo hacemos.

Cuando un campo tiene el atributo "auto_increment" no es necesario ingresar valor para
l, porque se inserta automticamente tomando el ltimo valor como referencia, o 1 si es
el primero.

Para ingresar registros omitimos el campo definido como "auto_increment", por ejemplo:
insert into libros (titulo,autor,editorial)
values('El aleph','Borges','Planeta');

Este primer registro ingresado guardar el valor 1 en el campo correspondiente al cdigo.

Si continuamos ingresando registros, el cdigo (dato que no ingresamos) se cargar
automticamente siguiendo la secuencia de autoincremento.

Un campo "auto_increment" funciona correctamente slo cuando contiene nicamente
valores positivos. Ms adelante explicaremos cmo definir un campo con slo valores
positivos.

Est permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo:

insert into libros (codigo,titulo,autor,editorial)
values(6,'Martin Fierro','Jose Hernandez','Paidos');

Pero debemos tener cuidado con la insercin de un dato en campos "auto_increment".
Debemos tener en cuenta que:
- si el valor est repetido aparecer un mensaje de error y el
registro no se ingresar.
- si el valor dado saltea la secuencia, lo toma igualmente y en
las siguientes inserciones, continuar la secuencia tomando el valor
ms alto.
- si el valor ingresado es 0, no lo toma y guarda el registro
continuando la secuencia.
- si el valor ingresado es negativo (y el campo no est definido
para aceptar slo valores positivos), lo ingresa.

Para que este atributo funcione correctamente, el campo debe contener solamente
valores positivos; ms adelante trataremos este tema.
Problema Resuelto:
Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla, si existe:
drop table if exists libros;

Creamos la tabla estableciendo como clave primaria y "auto_increment" el campo
"codigo":
create table libros(
codigo integer auto_increment,
titulo varchar(20),
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);

Al visualizar la estructura de la tabla:
describe libros;

vemos que en la columna "EXTRA" del campo "codigo" aparece "auto_increment", esto
significa que el campo es autoincrementable, en la columna "KEY" aparece "PRI", es
clave primaria.
Ingresamos algunos registros:
insert into libros (titulo,autor,editorial)
values('El aleph','Borges','Planeta');

Note que al detallar los campos para los cuales ingresaremos valores hemos omitido
"codigo"; cuando un campo es "auto_increment" no es necesario ingresar valor para l,
porque se genera automticamente. Recuerde que si es obligatorio ingresar los datos de
todos los campos que se detallan y en el mismo orden.
Si mostramos los registros:

select * from libros;

vemos que este primer registro ingresado guard el valor 1 en el campo correspondiente
al cdigo, comenz la secuencia en 1.
Ingresamos ms registros:
insert into libros (titulo,autor,editorial)
values('Martin Fierro','Jose Hernandez','Emece');
insert into libros (titulo,autor,editorial)
values('Aprenda PHP','Mario Molina','Emece');
insert into libros (titulo,autor,editorial)
values('Cervantes y el quijote','Borges','Paidos');
insert into libros (titulo,autor,editorial)
values('Matematica estas ahi', 'Paenza', 'Paidos');

Seleccionamos todos los registros:
select codigo,titulo,autor,editorial from libros;

Vemos que el cdigo, dato que no ingresamos, se carg automticamente siguiendo la
secuencia de autoincremento.
Est permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo:
insert into libros (codigo,titulo,autor,editorial)
values(6,'Martin Fierro','Jose Hernandez','Paidos');

Pero debemos tener cuidado con la insercin de un dato en campos "auto_increment".
Veamos los distintos casos.
Si ingresamos un valor repetido, aparecer un mensaje de error y el registro no se
ingresar:
insert into libros (codigo,titulo,autor,editorial)
values(2,'Martin Fierro','Jose Hernandez','Planeta');

Si ingresamos un valor que no sigue la secuencia, el dato es vlido, lo toma, por ejemplo:
insert into libros (codigo,titulo,autor,editorial)
values(15,'Harry Potter y la piedra filosofal','J.K. Rowling','Emece');

El siguiente registro insertado tomar el valor ms alto para seguir la secuencia (en este
caso 16):
insert into libros (titulo,autor,editorial)
values('Harry Potter y la camara secreta','J.K. Rowling','Emece');

Si ingresamos 0, no lo toma y guarda el registro continuando la secuencia (17 en este
caso):
insert into libros (codigo,titulo,autor,editorial)
values(0,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta');

Si ingresamos un valor negativo (y el campo no est definido para aceptar slo valores
positivos), lo ingresa:
insert into libros (codigo,titulo,autor,editorial)
values(-5,'Alicia a traves del espejo','Lewis Carroll','Planeta');

Problema Propuesto:

Una farmacia guarda informacin referente a sus medicamentos en una tabla
llamada "medicamentos".

1- Elimine la tabla,si existe:

2- Cree la tabla con la siguiente estructura:

create table medicamentos(
codigo integer auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio float,
cantidad integer,
primary key (codigo)
);

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:
(nombre, laboratorio,precio,cantidad)
Sertal,Roche,5.2,100
Buscapina,Roche,4.10,200
Amoxidal 500,Bayer,15.60,100

5- Verifique que el campo "cdigo" gener los valores de modo automtico:

6- Intente ingresar un registro con un valor de clave primaria repetido.

7- Ingrese un registro con un valor de clave primaria no repetido salteando la secuencia:

8- Ingrese el siguiente registro:

Note que sigue la secuencia.


Otros problemas:
Un videoclub almacena informacin sobre sus pelculas en una tabla llamada
"peliculas".

1- Elimine la tabla si existe.

2- Crela con la siguiente estructura:
-codigo (entero), autoincremento,
-titulo (cadena de 30),
-actor (cadena de 20),
-duracion (entero),
-clave primaria: codigo.

3- Visualice la estructura de la tabla "peliculas".

4- Ingrese los siguientes registros:
(titulo,actor,duracion)
Mision imposible,Tom Cruise,120
Harry Potter y la piedra filosofal,xxx,180
Harry Potter y la camara secreta,xxx,190
Mision imposible 2,Tom Cruise,120
La vida es bella,zzz,220

5- Seleccione todos los registros y verifique la carga automtica de los cdigos.

6- Actualice las pelculas cuyo cdigo es 3 colocando en "actor" 'Daniel R.'

7- Elimine la pelcula 'La vida es bella'.

8- Elimine todas las pelculas cuya duracin sea igual a 120 minutos.

9- Visualice los registros.

10- Ingrese el siguiente registro, sin valor para la clave primaria:

Mujer bonita,Richard Gere,120

Note que sigue la secuencia tomando el ltimo valor generado, aunque ya no est.

11- Ingrese el siguiente registro, con valor para la clave primaria:

1,Tootsie,D. Hoffman,90

Lo acepta porque la clave no est repetida.

12- Intente ingresar un registro con valor de clave repetida.

13- Ingrese el siguiente registro, sin valor para la clave primaria:

Un oso rojo,Julio Chavez,100

Columnas calculadas.
Es posible obtener salidas en las cuales una columna sea el resultado de un clculo y no
un campo de una tabla.

Si queremos ver los ttulos, precio y cantidad de cada libro escribimos la siguiente
sentencia:

select titulo,precio,cantidad
from libros;

Si queremos saber el monto total en dinero de un ttulo podemos multiplicar el precio por
la cantidad por cada ttulo, pero tambin podemos hacer que MySQL realice el clculo y lo
incluya en una columna extra en la salida:
select titulo, precio,cantidad,precio*cantidad
from libros;

Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en la
sentencia los siguientes clculos:

select titulo, precio,precio*0.1,precio-(precio*0.1)
from libros;

Problema Resuelto:

Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla, si existe:
drop table if exists libros;
Creamos la tabla:
create table libros( codigo int unsigned auto_increment, titulo varchar(40) not null, autor
varchar(30), editorial varchar(15), precio decimal(5,2) unsigned, cantidad smallint
unsigned, primary key (codigo) );
Ingresamos algunos registros:
insert into libros (titulo,autor,editorial,precio,cantidad)
values('El aleph','Borges','Planeta',15,100);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Martin Fierro','Jose Hernandez','Emece',22.20,200);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Antologia poetica','Borges','Planeta',40,150);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Aprenda PHP','Mario Molina','Emece',18.20,200);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Cervantes y el quijote','Borges','Paidos',36.40,100);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Manual de PHP', 'J.C. Paez', 'Paidos',30.80,100);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Harry Potter y la piedra filosofal','J.K. Rowling','Paidos',45.00,500);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Harry Potter y la camara secreta','J.K. Rowling','Paidos',46.00,300);
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',null,50);

Para obtener el monto total en dinero de un ttulo podemos multiplicar el precio por la
cantidad, por cada ttulo, MySQL realiza el clculo y lo incluye en una columna extra en la
salida:
select titulo, precio,cantidad,precio*cantidad from libros;

Para saber el precio de cada libro con un 10% de descuento podemos incluir en la
sentencia los siguientes clculos:

select titulo, precio,precio*0.1,precio-(precio*0.1) from libros;

Problema Propuesto:

Una empresa almacena los datos de sus empleados en una tabla "empleados".

1- Elimine la tabla "empleados" si existe.

2- Cree una tabla llamada "empleados" con la estructura necesaria
para almacenar la siguiente informacin:

- nombre del empleado,
- documento,
- sexo,
- domicilio,
- sueldo bsico (hasta 9999.99),
- hijos a cargo,
- clave primaria: documento.

3- Ingrese algunos registros:

(nombre,documento,sexo,sueldobasico,hijos)
Juan Perez,22333444,m,300,1
Ana Acosta,21333444,f,400,2
Alberto Lopez,24333444,m,600,0
Carlos Sanchez,30333444,m,550,3
Mariana Torres,23444555,f,600,1
Marcos Garcia,23664555,m,1500,2

4- La empresa est pensando en aumentar un 10% el sueldo a los empleados, y quiere
saber a cunto subira cada sueldo bsico, para ello usamos la siguiente sentencia en la
cual incluimos una columna que har el clculo de cada sueldo ms el 10%:

5- La empresa paga un salario familiar por hijos a cargo, $200 por cada hijo. Necesitamos
el nombre del empleado, el sueldo bsico, la cantidad de hijos a cargo, el total del salario
familiar y el suedo final (incluyendo el salario familiar):

Otros problemas:
Un comercio vende artculos de librera y papelera. Almacena en una tabla
los siguientes datos:

- codigo: int unsigned auto_increment, clave primaria,
- nombre: varchar(30),
- precio: decimal(5,2),
- cantidad: smallint unsigned.

1- Elimine la tabla, si existe.

2- Cree la tabla con la estructura necesaria para almacenar
los datos descriptos anteriormente.

3- Ingrese los siguientes registros:
(nombre,precio,cantidad)
lapices coloresx6,1.4,100
lapices coloresx12,2.5,100
lapices coloresx24,4.7,100
goma tinta,0.2,150
birome,1.2,200
escuadra,3.2,200
comps plstico,5,200
comps metal,8.4,250

4- El precio representa el costo del artculo al comprarlo. Este comercio vende sus
artculos por mayor y por menor, para la venta minorista incrementa el precio de costo en
un 10%, para la venta mayorista lo incrementa en un 5%. Muestre los precios de cada
artculo y calcule en 2 columnas diferentes el precio de cada uno de ellos al venderse por
mayor y por menor:

5- El gerente de dicho comercio necesita saber cunto dinero hay invertido en cada
artculo, para ello, necesitamos multiplicar el precio de cada artculo por la cantidad:

Potrebbero piacerti anche