Ver la Versión Completa : Sobre Generators
Tengo una BD en Firebird hecha con IBExpert. En una tabla creé dos registros, la clave primaria como Autoincremental (Generator) y un valor tipo numérico para almacenar datos. En un formulacio de C++ Builder, únicamente enlacé el valor tipo numérico a una DBEdit, y cada vez que trato de insertar un nuevo registro me manda el error:
SQL Error: violation of PRIMARY or UNIQUE KEY constraint "PK_TABLAX" on table "TABLAY". Error Code -803. Invalid insert or update value(s): objecto columns are constrained - no 2 table rows can have duplicate column values The SQL: INSERT INTO TABLAX (CLAVE, VALOR) VALUES (?,?);
El error supongo está en mi llave primaria, pues si la quito y dejo únicamente el otro campo todo marcha bien. ¿Alguna idea de dónde podría estar mi error? ¿En c++ builder? ¿En la definición de mi campo llave? De antemano gracias.
__cadetill
07-04-2004, 20:54:30
El problema está en que no asignas ningún valor a tu clave primaria, de ahí que, al ingresar un segundo registro te de el error de clave duplicada.
Tienes varias opciones, o asignas el valor (llamando al generador) desde C++ o bien, mediante un trigger en la propia base de datos llamas al generador
guillotmarc
07-04-2004, 21:02:47
Para complementar lo que dice Cadetill. El IB-Expert te puede ayudar a generar el Trigger para asignar valor a la clave primaria, o a crear un procedimiento almacenado que es el que debes llamar desde C++ Builder para asignar allí el valor de clave primaria.
El procedimiento almacenado y el trigger, se pueden crear en la misma pantalla en la que se crea el generador (al definir autoincremental el campo), en las pestañas adicionales.
Saludos.
Gracias por responder. Ya creé un trigger desde IB-Expert, previa creación de un generador:
CREATE GENERATOR GEN2;
SET GENERATOR GEN2 TO 0;
Y así mi trigger:
AS
BEGIN
IF (NEW.NUMERO IS NULL) THEN
NEW.NUMERO = GEN_ID(GEN2,1);
END
Ahora quiero hacer pruebas a ver si todo quedó ya bien. ¿Cómo realizo la inserción desde SQL? He intentado desde el SQL Editor escribiendo:
INSERT INTO TABLAX VALUES (13);
INSERT INTO TABLAX (NUMERO, VALOR) VALUES (13);
Pero manda error. Si escribo...
INSERT INTO TABLAX (NUMERO, VALOR) VALUES (1,13);
... Lo hace bien, pero no veo que incremente la clave. Y si vuelvo a ejecutar la misma sentencia otra vez (INSERT INTO TABLAX (NUMERO, VALOR) VALUES (1,13);) me indica que no puede haber claves repetidas. Disculparán mi falta de experiencia, pero quiero asegurarme que mi trigger está bien y funciona, pero no sé cómo realizar mi sentencia para constatarlo.
Saludos.
___________________
Noé Alejandro Castro
guillotmarc
07-04-2004, 21:53:52
Hola.
No intentes asignar el valor de NUMERO, lo hará el Trigger.
Prueba con la sentencia :
INSERT INTO TABLAX (VALOR) VALUES (13);
Verás que la puedes ejecutar tantas veces como desees, y que siempre asigna automaticamente el siguiente valor en NUMERO.
Saludos.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.