Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Aplicar Constraint

Estas en el tema de Aplicar Constraint en el foro de Bases de Datos General en Foros del Web. Hola a todos, Tengo un problema y espero puedan ayudarme. Tengo una tabla con campos: CODUSUARIO,CODMODULO,CODRANGO,OTRO. Necesito impedir que se ingresen registro duplicados teniendo en ...
  #1 (permalink)  
Antiguo 23/08/2009, 10:53
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Aplicar Constraint

Hola a todos,

Tengo un problema y espero puedan ayudarme.

Tengo una tabla con campos:
CODUSUARIO,CODMODULO,CODRANGO,OTRO.

Necesito impedir que se ingresen registro duplicados teniendo en cuenta lo 3 primeros campos ejemplo de la forma:

si tengo:
CODUSUARIO = 'PEPE'
CODMODULO = 'A'
CODRANGO = 'C'

Si este regitro existe, necesito que no se pueda ingresar uno nuevo con datos.
CODUSUARIO = 'PEPE'
CODMODULO = 'A'
CODRANGO = 'B'

-> Sin utilizar foraneas.

Primary key = 'CODUSUARIO' actualmente.

La base de datos es sybase, no importa si se aplica para otra BD.

De antemano, mil gracias.
  #2 (permalink)  
Antiguo 23/08/2009, 11:05
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Aplicar Constraint

No se para sysbase, pero existe un concepto de primary key compuesta.

primary key (llave1,llave2,llave3)

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 23/08/2009, 11:14
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Respuesta: Aplicar Constraint

Gracias huesos2 por tu pronta respuesta.

Actualmente el primary key de la tabla es = (llave1,llave2).
E intente hacer un alter cambiando a (llave1,llave2,llave 3)

Pero no se por que no funciona, ya que a un usuario le dejo pasar un registro de la foma?

'JUAN','50','A'
y otro.
'JUAN','50','B'.

y Solo debe existir un solo rango para modulo 50. No puede un mismo usuario en el módulo 50 con permiso de presidente y tecnico al tiempo. Debe ser uno u otro.

Sera algun problema de base de datos?
  #4 (permalink)  
Antiguo 23/08/2009, 11:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Aplicar Constraint

Como te igo, no se de sysbase, pero si ya hay un registro mal puesto, creo que debes pasar primero tus datos a otra tabla. Hacer un delete y traer nuevamente los datos después del alter que apliques.

Dejo el tema abierto para la gente que maneje sysbase.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 23/08/2009, 11:55
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Respuesta: Aplicar Constraint

Listo, para los interesados.


CODUSUARIO = 'PEPE'
CODMODULO = 'A'
CODRANGO = 'C'

EL problema es que anteriormente la tabla estaba creada asi.

CREATE TABLE dbo.mitabla(
codusuario varchar(40) not null,
codmodulo numeric(3) not null,
codrango varchar(2) not null,
activo numeric(1),
aux varchar(5)
) lock allpages go


Revisando la definicion de la tabla -> EL ERROR.
ALTER TABLE dbo.mitabla ADD CONSTRAINT mitabla_12345
PRIMARY KEY (codusuario,codmodulo,codrango)


Cuando lo correcto debia ser:
ALTER TABLE dbo.mitabla ADD CONSTRAINT mitabla_12345
PRIMARY KEY (codusuario,codmodulo)


Por que: La regla exige que el rango se duplique con valores en los 3 campos, de lo contrario permite el insert.

Perdon no me fije bien en como la habian definido previamente.

Un saludo, espero les sea útil. Y muchas gracias a quienes respondieron...
  #6 (permalink)  
Antiguo 23/08/2009, 12:03
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Respuesta: Aplicar Constraint

ahora, como aplico el cambio sin tener que borrar la tabla y crear otra para pasar la info temporalmente y eliminar dicho campo el la clave compuesta? Esto si es tema de Sybase...

Alguien que me conozca este motor? Ya intente con:
Alter table dbo.mitabla delete primary key => Pero no funciona.
Alter table dbo.mitabla delete primary key(cam1,cam2,cam3) => tampoco funciona.
Y cambie por drop primary key y nada.

Última edición por SPAWN3000; 23/08/2009 a las 12:13
  #7 (permalink)  
Antiguo 23/08/2009, 12:21
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Respuesta: Aplicar Constraint

Listo=>

exec sp_dropkey primary,mitabla,micambpo.

Nota: mitabla se debe usar sin dbo.

FInalizado.
  #8 (permalink)  
Antiguo 23/08/2009, 12:48
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
Respuesta: Aplicar Constraint

Si esto no funciona de acuerdo a la version.
Aplicar.
ALTER TABLE mitabla drop constrain nameconstrain_123
exec sp_dropkey primary,mitabla

Luego efectuar el alter de forma correcta.

NOTA: (Hacer una copia inicialmente de la tabla)
Si se necesita eliminar registros duplicados por campo doble a algunos les puede funcionar esto.
delete from mitabla where id = (
select id from mitabla tb where mitabla.codusuario = tb.codusuario and mitabla.codramo = tb.codramo)

Pero en sybase no funciona.
Pero me sirvio esto que encontre->
SELECT DISTINCT
Empleados.Nombre, Empleados.IdEmpleado
FROM
Empleados
WHERE
Empleados.Nombre
In (
SELECT Nombre FROM Empleados As Tmp GROUP BY Nombre HAVING Count(*) > 1)
ORDER BY
Empleados.Nombre

Última edición por SPAWN3000; 23/08/2009 a las 13:11
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:46.