Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Creacion de campos clave en Interbase (https://www.clubdelphi.com/foros/showthread.php?t=16115)

senpiterno 16-11-2004 18:14:58

Creacion de campos clave en Interbase
 
Hola amigos...

Mi duda es la siguiente: es posible crear 2 Primary Key en una tabla, pero que cada uno por si solo sea unico dentro de esta. Me explico obviamente es posible crear 2 campos claves dentro de una tabla, los cuales en su conjunto seran unicos, pero es perfectamente factible que uno de esos campos claves se repita dentro de tabla, ya que la clave primaria de esta, estara compuesta por 2 campos y el concepto de "clave unica" lo dara la combinatoria de valores de estos 2 campos y no cada uno por si solo, que es lo que yo busco hacer...

Gracias por cuanquier ayuda....

Saludos.....

kinobi 16-11-2004 18:41:23

Hola,

No entiendo lo siguiente:

Cita:

Empezado por senpiterno
...es posible crear 2 Primary Key en una tabla, pero que cada uno por si solo sea unico dentro de esta... pero es perfectamente factible que uno de esos campos claves se repita dentro de tabla,...

¿Cómo puede ser que esos "segmentos" de la clave primaria sean a la vez únicos y que puedan repetirse?

Saludos.

senpiterno 16-11-2004 20:37:24

Cita:

Empezado por kinobi
¿Cómo puede ser que esos "segmentos" de la clave primaria sean a la vez únicos y que puedan repetirse?

kinobi, lo que intento explicar es primero lo que quiero lograr hacer:
Cita:

Empezado por senpiterno
es posible crear 2 Primary Key en una tabla, pero que cada uno por si solo sea unico dentro de esta.

y despues lo que me esta ocurriendo ahora con la declaracion de las primary key de la tabla:
Cita:

Empezado por senpiterno
Me explico obviamente es posible crear 2 campos claves dentro de una tabla, los cuales en su conjunto seran unicos, pero es perfectamente factible que uno de esos campos claves se repita dentro de tabla, ya que la clave primaria de esta, estara compuesta por 2 campos y el concepto de "clave unica" lo dara la combinatoria de valores de estos 2 campos y no cada uno por si solo

Hasta donde entiendo, cuando se crea mas de una clave primaria en una tabla, es decir, mas de un campo formara la clave principal. La conformacion de un valor unico es la combinacion de dichos campos y no cada uno por si solo, por ejemplo, en la definicion de esta tabla:
Código SQL [-]
CREATE TABLE SUBMODULOSUSUARIOS (
CODIGOSUBMODULO CODIGO_CORTO NOT NULL,
CODIGOMODULO CODIGO_CORTO NOT NULL,
CODIGOPERFIL CODIGO_CORTO NOT NULL,
ATRIBUTO TIPO_ATRIBUTO NOT NULL,
ORDEN INTEGER NOT NULL);
 
ALTER TABLE SUBMODULOSUSUARIOS ADD CONSTRAINT PK_SUBMODULOSUSUARIOS PRIMARY KEY (CODIGOSUBMODULO, CODIGOMODULO, CODIGOPERFIL);
Existen 3 campos claves, CODIGOSUBMODULO, CODIGOMODULO, CODIGOPERFIL, 2 registros direrectes para esta tabla podrian ser:
Código Delphi [-]
 TSubModulosBD.Insert;
TSubModulosBD.FieldValues['CODIGOSUBMODULO']:='U1';
TSubModulosBD.FieldValues['CODIGOMODULO']:='H1';
TSubModulosBD.FieldValues['CODIGOPERFIL']:='P1'
TSubModulosBD.FieldValues['ORDEN']:=1;
TSubModulosBD.Post;
 
TSubModulosBD.Insert;
TSubModulosBD.FieldValues['CODIGOSUBMODULO']:='U1';
TSubModulosBD.FieldValues['CODIGOMODULO']:='H2';
TSubModulosBD.FieldValues['CODIGOPERFIL']:='P3'
TSubModulosBD.FieldValues['ORDEN']:=1;
TSubModulosBD.Post;
Si te fijas en los dos el valor de CODIGOSUBMODULO=U1, pero como los demas valores de los campos primarios son diferentes, en las 2 inserciones, el motor los toma como claves primarias diferentes.
Lo que yo quiero es que cada valor de cada campo que conforme la clave primaria de una tabla, sea unico.

Espero hacer sido mas explicito

Saludos....

kinobi 16-11-2004 23:16:18

Hola...

ahora sí he comprendido :)

Cita:

Empezado por senpiterno
Hasta donde entiendo, cuando se crea mas de una clave primaria en una tabla, es decir, mas de un campo formara la clave principal.

En realidad, según la teoría relacional, sólo puedes crear una clave primaria, o principal, el resto son claves candidatas (o alternativas). Cuando tienes una clave primaria (o alternativa) formada por más de una columna, ésta recibe, además, la denominación de segmentada.

Cita:

Empezado por senpiterno
La conformacion de un valor unico es la combinacion de dichos campos y no cada uno por si solo

Correcto.

Cita:

Empezado por senpiterno
Lo que yo quiero es que cada valor de cada campo que conforme la clave primaria de una tabla, sea unico.

Crea índices únicos para las columnas (o combinación de columnas) que quieras que sean únicas. Los índices únicos permiten, de esta manera, definir las claves candidatas...

De la documentación...

Código SQL [-]
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX nombre_indice ON nombre_tabla ( col [, col ...]);
De todas formas, si todos los segmentos (columnas) de la clave principal son únicos, cualquiera de ellos, tomados de manera individual, pueden ser clave principal. Vamos, que no tendrías que utilizar una clave segmentada.

Saludos.

senpiterno 17-11-2004 06:41:02

Gracias kinobi por tu respuesta, solucione el problema asignadole un CONSTRAINT a la tabla
Código SQL [-]
ALTER TABLE Nom_Tabla ADD CONSTRAINT Nom_Constraint UNIQUE (Nom_Campo)
Que tambien genera un indice unico para la columna indicada...
La clausula UNIQUE realiza lo que queria lograr es decir indicar que el campo tendra valores unicos (aunque el campo no este designado como primary key), de esta forma como tu me mencionabas:
Cita:

Empezado por kinobi
De todas formas, si todos los segmentos (columnas) de la clave principal son únicos, cualquiera de ellos, tomados de manera individual, pueden ser clave principal.

Como los dos campos de mi tabla por si solos eran unicos, tome la decicion de que solo uno de ellos fuera primary key, y al otro le asigne el Constraint, dando el resultado que deseaba....

Saludos y gracias denuevo...

kinobi 17-11-2004 11:44:35

Hola,

Cita:

Empezado por senpiterno
Que tambien genera un indice unico para la columna indicada...

Realmente, la restricción UNIQUE es otra manera de indicarle al servidor la creación de un índice único. La única diferencia es que UNIQUE trabaja a nivel de columna, y CREATE INDEX permite crear índices sobre combinaciones de columnas (en el caso de índices únicos, serían claves candidatas).

Saludos.


La franja horaria es GMT +2. Ahora son las 15:31:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi