De nuevo excepción en modifición BD (integridad)

Como te decía antes... Pff! Ya la hemos preparado! Lo que me temía!
Uso MySQL Server 5.0, he cambiado la definición de las tablas para crearlas de tipo InnoDB como me dijiste, y hay una que no me deja crearla. Te escribo su definición (es un poco larga, je je)
CREATE TABLE operacion (
Id_usuario VARCHAR(12) NOT NULL,
id_cartera VARCHAR(12) NOT NULL,
id_operacion SMALLINT(5) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
fecha DATE NOT NULL,
tipo_operac ENUM ('Compra', 'Venta', 'Split', 'Absorcion', 'Cobro dividendos', 'Obsequio') NOT NULL,
empr_absorbida VARCHAR(50) NULL,
num_titulos SMALLINT UNSIGNED NULL,
num_tit_nuevos SMALLINT UNSIGNED NULL,
num_tit_antiguos SMALLINT UNSIGNED NULL,
prec_unit DOUBLE(7,3) UNSIGNED NULL,
efect_total DOUBLE(11,3) UNSIGNED NULL,
reintegr_unit DOUBLE(7,3) UNSIGNED NULL,
reintegr_total DOUBLE(11,3) UNSIGNED NULL,
dvdo_unit DOUBLE(7,3) UNSIGNED NULL,
dvdo_total DOUBLE(11,3) UNSIGNED NULL,
benef_perd DOUBLE(10,3) NULL,
objetivo_operac DOUBLE(5,2) UNSIGNED NULL,
stop_perd_operac DOUBLE(4,2) UNSIGNED NULL,
riesgo_operac ENUM ('Muy alto', 'Alto', 'Medio', 'Bajo', 'Muy bajo') NULL,
saldo_tit_operac SMALLINT NULL,
CONSTRAINT operacion_pk PRIMARY KEY (id_usuario, id_cartera, id_operacion),
CONSTRAINT operacion_fk1 FOREIGN KEY (id_usuario, id_cartera) REFERENCES cartera (id_usuario, id_cartera),
CONSTRAINT operacion_fk2 FOREIGN KEY (nombre) REFERENCES empresa (nombre)
) ENGINE = INNODB;
Al ejecutarlo, me da el fallo "Incorrect table definition; there can be only one auto
column and it must be defined as a key"
La definición tiene que ser así, es lo que necesito. Tengo una tabla USUARIO que almacena la información de los usuarios (con "id_usuario" como primary key), una tabla CARTERA que almacena la información de las carteras de forma que se sepa a qué usuario pertenece cada una (con "id_usuario" y "id_cartera" como primary key), y en esta tabla que quiero crear almaceno la información de las operaciones de forma que se sepa a qué cartera, que a su vez pertenece a un usuario, pertenece cada una (por lo tanto, con "id_usuario", "id_cartera" y "id_operacion" como primary key). Para diferenciar unas operaciones de otras, dentro de la misma cartera de un mismo usuario, me resulta muy útil el auto increment, pero... Ya ves que no me deja!, y es imposible que la defina como única primary key dado mi modelo de datos.
En su momento consulte este problema y me dieron como solución hacer la tabla de tipo
MyIsam, y ahora tú me pides que la haga InnoDB para que me funcione lo de la integridad. ¿Qué hago? ¿Cómo soluciono con tabla InnoDB el error que tengo con el auto increment? Y eso suponiendo que no me surjan más problemas al manejar triggers u otro tipo de cosas con el nuevo tipo de tabla!

1 respuesta

Respuesta
1
Que no cunda el pánico.
En los foros de mysql dan una solución:
Aquí http://forums.mysql.com/read.php?20,35656,35741#msg-35741
Consistiría en que añadas al script de creación de la tabla:
KEY UNIQUE operation_key (id_operation)
Venga que ya no te queda ná :)
Bueno! Acabo de leer tu solución pero ya he resuelto el problema! Ya tengo tablas InnoDB con un funcionamiento correcto del autoincrement, y no he encontrado ningún problema más (al menos de momento)
Una dudilla que tengo. ¿Debo ejecutar "start transaction"? En la documentación de MySQL he visto este código
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
A mí de momento me va bien con "setAutoCommit(false)"
Y otra cosa más. ¿Con sólo sentencias SELECT debo usar también el commit?
Saludos!
Me alegro.
No tienes que ejecutar START TRANSACTION; ni COMMIT;, de eso se encarga el driver JDBC por ti. En las últimas versiones de MySQL se pueden tener scripts en la BD, en ese caso si que podría ser útil el START TRANSACTION (no puedo darte detalles porque no lo he tenido que utilizar nunca).
Con sentencias select tampoco te hace falta utilizar commit (si lo usas no pasa nada tampoco), sólo es necesario cuando modificas datos (insert, delete, update).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas