Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   mysql + tabla con 2 keys (https://www.clubdelphi.com/foros/showthread.php?t=57222)

alt126 09-06-2008 06:49:07

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

poliburro 09-06-2008 14:29:10

Cita:

Empezado por alt126 (Mensaje 292202)
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

alt126 10-06-2008 08:59:23

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?

alt126 12-06-2008 06:07:16

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

roman 12-06-2008 15:50:30

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

alt126 13-06-2008 13:41:32

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

alt126 18-06-2008 13:26:14

nadie puede orientarme un poco??

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

roman 18-06-2008 17:06:48

¿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

alt126 20-06-2008 09:02:15

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

roman 20-06-2008 20:31:28

Esto no tiene pies ni cabeza :confused:

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

alt126 25-06-2008 10:53:15

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!!

Caro 25-06-2008 14:18:54

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

alt126 26-06-2008 07:00:51

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

roman 26-06-2008 15:59:51

Cita:

Empezado por alt126 (Mensaje 296280)
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

alt126 27-06-2008 13:55:27

Gracias por la info!!!


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

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