Diferencia KEY y PRIMARY KEY

Iniciado por ma__tt, 24 Diciembre 2009, 13:48 PM

0 Miembros y 1 Visitante están viendo este tema.

ma__tt

Hola, no entiendo cuales la diferencia entre que una clave sea KEY o PRIMARY KEY. Alguién puede aclararme esto?  :)

Muchas gracias

^Tifa^

Ambos son indices. La mayor diferencia radica en que KEY accepta valores nulos y repetidos, sin embargo PRIMARY KEY no accepta valores nulos ni repetidos  ;)

ma__tt

Vale, capto xd  Ahora bien, he visto en un diseño de una base de datos, que en todas las tablas, tenía un campo (o varios) con primary key, y el resto de atributos puestos como key. La explicación que da es que así se mejora los tiempos de búsqueda. Como véis esto? Una chapuza... es necesario o puede venir bien?... no se debe hacer nunca... en fin, a ver vuestra opinión cuál es y ya de paso, si podéis explicarme que implicaciones tiene esta forma de proceder :P

muchas gracias

seba123neo

claro las claves de una tabla la pueden conformar varios campos (indices compuestos), ponerle indices a las tablas es necesario para como decis, acelerar en lo tiempos de busqueda, por experiencia que he visto consultas (habia una consulta que bajo de 1 minuto a 2 segundos con solo agregarle un indice), pero los indices no van en cualquier campo, sino en los que vas a usar en el WHERE, y que presenten valores repetidos. ^TiFa^ te lo puede explicar mejor, pero creo que ya esta cansada de explicar siempre lo mismo ;D, porque ya hubo un post parecido. igualmente te sugiero que hagas una busqueda en internet sobre "que son los indices" y te aseguro vas a encontrar un monton de paginas que te explican muy bien.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

^Tifa^

Lol seba123neo

Haber chico depende, suponte que quieres la informacion (nombres, apellidos, telefonos) de distintas personas. Procedes a crear 1 sola tabla con todos los datos asumiendo que es suficiente:

Código (sql) [Seleccionar]

SQL> create table data(
  2  nombres char(20),
  3  apellidos char(20),
  4  id integer,       
  5  primary key(id),       
  6  telefono nchar(20));

Table created.


Y vienes y quieres insertarle datos ahora:

CitarSQL> insert into data values('Juan Manuel', 'Perez', 1, '555-2344');

1 row created.

SQL> insert into data values('Juan Manuel', 'Perez', 1, '666-3455');
insert into data values('Juan Manuel', 'Perez', 1, '666-3455')     
*                                                                   
ERROR at line 1:                                                   
ORA-00001: unique constraint (MARIAN.SYS_C005303) violated         


Te da error porque obviamente el campo ID que es primario no accepta valores repetidos, por ende o obvias tener el campo primario o le agregas otro valor distinto a 1 pero en este caso terminarias con algo tipo:

Código (sql) [Seleccionar]


SQL> select * from data;

NOMBRES              APELLIDOS                    ID TELEFONO
-------------------- -------------------- ---------- --------------------
Juan Manuel          Perez                         1 555-2344           
Juan Manuel          Perez                         2 555-2344
Juan Manuel          Perez                         3 555-2344



O quizas quieras resolver rapido, y en vez de declarar el campo ID como primary key lo declares como KEY o INDEX para repetir valores y terminarias con algo tipo:

Código (sql) [Seleccionar]

SQL> select * from data;

NOMBRES              APELLIDOS                    ID TELEFONO
-------------------- -------------------- ---------- --------------------
Juan Manuel          Perez                         1 555-2344           
Juan Manuel          Perez                         1 678-2344
Juan Manuel          Perez                         1 777-2234



Que a la hora de consultar la tabla seria mas rapido en retornarte el valor que si hicieras JOIN con otra, pero aunque esto a nivel de optimizacion es mas rapido, te dejaria valores repetidos y redundantes en la tabla como el ejemplo expuesto anteriormente... por ende en su lugar seria favorable eliminar el campo telefono de la tabla Data y crear otra tabla que haga referencia al telefono de cada usuario.

Código (sql) [Seleccionar]

SQL> create table copia(
  2  id integer,       
  3  telefono nchar(20));

Table created.

SQL> create index indice on copia(id);

Index created.




Le insertas datos:

Código (sql) [Seleccionar]

SQL> insert into copia values(1,'666-7655');

1 row created.

SQL> insert into copia values(1, '765-4599');

1 row created.

SQL> select * from copia;

        ID TELEFONO
---------- --------------------
         1 666-7655
         1 765-4599




Y ya tienes una tabla no desnormalizada donde puedes agregar todos los telefonos que quieras para un usuario en especifico, y consultar esos datos de retorno:

Código (sql) [Seleccionar]

SQL> select a.nombres, b.telefono from copia b, data a;

NOMBRES              TELEFONO
-------------------- --------------------
Juan Manuel          666-7655
Juan Manuel          765-4599