Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
mysql + tabla con 2 keys

Hola.

Supongo que sera una tonteria, pero siempre he estado usando msaccess y otro tipo de BD y ahora con mysql me encuentro estos errores.

He hecho una tabla y necesito que tenga 2 keys, a modo de ID e ID2, es decir que pueda haber varios registros que repitan el mismo ID o ID2. Pero al poner en la tabla ambos campos como primary key, al intentar insertar datos me sale un mensaje de duplicidad de datos (ojo el mensaje me sale en c++ builder).

Como podria solucionarlo?

GRACIAS
__________________
Un saludo

Antonio
Responder Con Cita
  #2  
Antiguo 09-06-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por alt126 Ver Mensaje
Hola.

al intentar insertar datos me sale un mensaje de duplicidad de datos (ojo el mensaje me sale en c++ builder).

Como podria solucionarlo?

GRACIAS

Eso debe suceder por que el valor de Id se repite en Id2, verifica los datos que intentas grabar

Saludos
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 10-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
No me he explicado bien...

Tengo una tabla...:

ID_Cliente / Numero_Cuenta_Bancaria

Yo quiero que los campos claves sean los 2, porque un cliente puede tener varias cuentas...con lo que si pongo solo ese campo clave no me dejaria. Y que aunque no es probable, clientes distintos pudieran tener la misma cuenta.

Quiero datos como estos:

001 / 1234
001 / 1235
002 / 1235

Ahora creo que me explico mejor...

¿Pero como podria hacer esto?
__________________
Un saludo

Antonio
Responder Con Cita
  #4  
Antiguo 12-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
Nadie sabe como puedo poner esos dos campos como clave?

estoy buscando por internet, pero no me sale nada al respecto o no se bien como buscarlo...

Gracias
__________________
Un saludo

Antonio
Responder Con Cita
  #5  
Antiguo 12-06-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Código SQL [-]
alter table tu_tabla
add unique cliente_cuenta (ID_Cliente, Numero_Cuenta_Bancaria)

tu_tabla es el nombre de tu tabla y cliente_cuenta el nombre que le quieras poner a la clave.

// Saludos
Responder Con Cita
  #6  
Antiguo 13-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
Nada...no funciona!!!

Vamos a ver...me sigo explicando:

Tengo la tabla con 3 campos:

http://www.geocities.com/antonio_garcia_web/1.bmp

Si intento hacer esto:

Código SQL [-]
INSERT INTO clientes_cuentas_bancarias (ID_Cliente,Numero_Cuenta) values ('0','100')

Me sale el siguiente error en builder c++ 6:

http://www.geocities.com/antonio_garcia_web/2.bmp

Pero si lo meto desde la BD, sin problemas:

http://www.geocities.com/antonio_garcia_web/3.bmp
__________________
Un saludo

Antonio

Última edición por alt126 fecha: 13-06-2008 a las 13:44:35.
Responder Con Cita
  #7  
Antiguo 18-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
nadie puede orientarme un poco??

estoy haciendo la aplicacion...pero ese fallo no lo puedo dejar ahi...
__________________
Un saludo

Antonio
Responder Con Cita
  #8  
Antiguo 18-06-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Qué usas para administrar tus bases? Poco puede deducirse de una imagen, pero da la impresión de que tienes tanto a ID_Cliente como a Numero_cuenta como llaves primarias, lo cual sería erróneo porque la unicidad la logras con la combinación de ambas y no cada una por su cuenta.

Haz una consulta

Código SQL [-]
show create table clientes_cuentas_bancarias

para obtener la definición de la tabla y pega aquí el resultado.

// Saludos
Responder Con Cita
  #9  
Antiguo 20-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
El resultado de la consulta es:

Código SQL [-]
CREATE TABLE `clientes_cuentas_bancarias` (
  `ID_Cliente` int(4) NOT NULL,
  `Numero_Cuenta` varchar(23) NOT NULL default '' COMMENT 'Nº cuenta bancaria',
  `Banco` varchar(30) default NULL COMMENT 'Nombre del banco',
  PRIMARY KEY  (`ID_Cliente`,`Numero_Cuenta`),
  UNIQUE KEY `cliente_cuenta` (`ID_Cliente`,`Numero_Cuenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

El programa que utilizo es el navicat 8 y tambien phpadmin.

Eso es justamente lo que quiero...tener ambos dos campos como claves, para no poder repetir los 2 valores, pero si repetir valores en cada campo. Esto no se como hacerlo!!!!

GRACIAS
__________________
Un saludo

Antonio
Responder Con Cita
  #10  
Antiguo 20-06-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Esto no tiene pies ni cabeza

En tu definición de tabla, ciertamente sobra un índice, puedes omitir el unique y quedarte con el primary. Aun así, no debería fallar.

Me parece raro esto:

Dices que si haces

Código SQL [-]
INSERT INTO clientes_cuentas_bancarias (ID_Cliente,Numero_Cuenta) values ('0','100')

obtienes este error:

http://www.geocities.com/antonio_garcia_web/2.bmp

Pero el mensaje del error menciona:

Cita:
Duplicate entry '0-12' for key 1
¿Cómo puede marcarte eso, si estás intentando insertar '0-100' no '0-12' y casualmente el '0-12' sí que lo tienes, al menos según se ve en

http://www.geocities.com/antonio_garcia_web/3.bmp

// Saludos
Responder Con Cita
  #11  
Antiguo 25-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
no no no...quizas es que estuve haciendo pruebas...y puse fotos de una prueba y comente un ejemplo de otra.

En la tabla tengo:

Código SQL [-]
CREATE TABLE `clientes_cuentas_bancarias` (
  `ID_Cliente` int(4) NOT NULL,
  `Numero_Cuenta` varchar(23) NOT NULL default '' COMMENT 'Nº cuenta bancaria',
  `Banco` varchar(30) default NULL COMMENT 'Nombre del banco',
  PRIMARY KEY  (`ID_Cliente`,`Numero_Cuenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


aqui puedes ver todo el proceso -> video

Gracias por intentar ayudarme...es algo que necesito que funcione y no se como hacerlo!!
__________________
Un saludo

Antonio
Responder Con Cita
  #12  
Antiguo 25-06-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola alt126, por lo que he visto estas intentando ejecutar dos veces tu insert.

Código Delphi [-]
 BD->qOperaciones->SQL->ADD("INSERT.......")
 .......
 .......
 BD->qOperaciones->ExecSQL(); //con esta instrucción ya has registrado
 BD->qOperaciones->Active=true; //aqui como no has limpiado lo que tienes dentro de SQL, intenta volver a registrar, pero como
                          //ya esta te sale el error, porque los dos campos son llaves primarias y no puede haber repetidos.

como te dice Roman, si pones a los dos campos como primary key, no podras tener un registro que tenga un cliente y cuenta bancaria repetidos y en tu codigo estas haciendo eso, registras el mismo cliente y una misma cuenta para ese cliente.

Yo veo una relación de 1 a muchos entre tu tabla clientes y cuentas bancarias, donde el id_cliente de tu tabla cuenta bancaria llegaría a ser una llave foranea (foreing key), ahora también dices que pueden repetirse las cuentas bancarias, si es así, entonces es una relación muchos a muchos, ahí necesitas una tabla intermedia entre tu tabla clientes y cuentas bancarias en dicha tabla id_cliente, cuenta_bancaria, seran tus llaves foraneas.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #13  
Antiguo 26-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
Lo que decias es completamente cierto...y ya esta solucionado.

No sabia que
Cita:
tTable->Active = true;
hace la consulta otra vez despues de insert. Pensaba que era solamente para activar o no la consulta.

Lo he probado y funciona perfectamente.

Sobre la BD, la idea es que un mismo cliente puede tener varias cuentas de banco, es decir que en la misma tabla puede aparecer varias veces el mismo cliente, por lo que no se puede poner solo el cliente como key, tiene que ser la combinacion de cliente y cuenta...eso si que no se repite.

No creo necesitar una tabla intermedia, ya que tengo una tabla clientes y luego esta tabla que es la que guarda las cuentas de cada cliente.

En access lo tenia asi y funcionaba, pero aqui me daba problemas supongo que por el active=true.

Gracias...por ahora todo correcto
__________________
Un saludo

Antonio
Responder Con Cita
  #14  
Antiguo 26-06-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por alt126 Ver Mensaje
No sabia que
Cita:
tTable->Active = true;
hace la consulta otra vez despues de insert. Pensaba que era solamente para activar o no la consulta.
Para que no te tome desprevenido en un futuro, te comento que Active se usa para consultas SQL que regresan registros (típicamente un SELECT), mientras que ExecSQL se usa para consultas que no regresan registros (como INSERT, DELETE y UPDATE).

// Saludos
Responder Con Cita
  #15  
Antiguo 27-06-2008
Avatar de alt126
alt126 alt126 is offline
Miembro
 
Registrado: dic 2004
Posts: 171
Poder: 20
alt126 Va por buen camino
Gracias por la info!!!
__________________
Un saludo

Antonio
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
hot keys alfil123 OOP 3 25-04-2007 01:50:16
Sending Keys Xianto API de Windows 0 13-07-2006 10:00:32
Códigos escape y virtual Keys Codes Cabanyaler API de Windows 2 05-06-2006 16:13:13
Foreign keys desactivadas JCDiaz999 Firebird e Interbase 2 31-05-2006 13:09:16
Duda acerca de las keys joanajj Firebird e Interbase 5 20-05-2006 21:23:28


La franja horaria es GMT +2. Ahora son las 22:07:51.


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