Hola, no entiendo cuales la diferencia entre que una clave sea KEY o PRIMARY KEY. Alguién puede aclararme esto? :)
Muchas gracias
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 ;)
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
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.
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:
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:
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:
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.
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:
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:
SQL> select a.nombres, b.telefono from copia b, data a;
NOMBRES TELEFONO
-------------------- --------------------
Juan Manuel 666-7655
Juan Manuel 765-4599