Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2004
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
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.....
Responder Con Cita
  #2  
Antiguo 16-11-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 16-11-2004
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
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....

Última edición por senpiterno fecha: 16-11-2004 a las 20:42:31.
Responder Con Cita
  #4  
Antiguo 16-11-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
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.

Última edición por kinobi fecha: 16-11-2004 a las 23:27:58.
Responder Con Cita
  #5  
Antiguo 17-11-2004
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
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...

Última edición por senpiterno fecha: 17-11-2004 a las 06:45:47.
Responder Con Cita
  #6  
Antiguo 17-11-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:23:16.


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
Copyright 1996-2007 Club Delphi