Asunto: ¿Se pueden incluir varios campos en un índice único MySQL?
Estoy utilizando MySQL Server 5.0 por primera vez y no tengo muchos conocimientos de SQL ni de bases de datos. Tengo una pequeña duda: tengo una tabla llamada "factura" con varios campos (codigo, numero, fecha, anio, codigocliente, importetotal...). Lo que quiero es que la aplicación de Facturación que estoy desarrollando dé un error si el usuario introduce una factura con el mismo año y con el mismo número. Digamos que no puede haber dos facturas con el mismo año y con el mismo número.
Necesito hacerlo con una consulta SQL pues no tengo posibilidad de instalar MySQL Administrator u otro software para acceso en modo gráfico a modificar las propiedades de las tablas, sólo puedo ejecutar consultas SQL.
Publicado:
Mar Mar 09, 2010 6:54 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: ¿Se pueden incluir varios campos en un índice único MySQ
Anuncios
varios escribió:
Estoy utilizando MySQL Server 5.0 por primera vez y no tengo muchos conocimientos de SQL ni de bases de datos. Tengo una pequeña duda: tengo una tabla llamada "factura" con varios campos (codigo, numero, fecha, anio, codigocliente, importetotal...). Lo que quiero es que la aplicación de Facturación que estoy desarrollando dé un error si el usuario introduce una factura con el mismo año y con el mismo número. Digamos que no puede haber dos facturas con el mismo año y con el mismo número.
Necesito hacerlo con una consulta SQL pues no tengo posibilidad de instalar MySQL Administrator u otro software para acceso en modo gráfico a modificar las propiedades de las tablas, sólo puedo ejecutar consultas SQL.
Sí, por supuesto, si quieres que sea el motor de base de datos quien compruebe la unicidad de la tabla "factura" por el campo "anio" y "numero" puedes utilizar la siguiente consulta SQL de MySQL Server:
Código:
ALTER TABLE factura ADD UNIQUE INDEX factura_numero_anio (numero, anio);
Donde:
* factura_numero_anio: será el nombre del índice, le puedes poner el que quieras.
Publicado:
Mar Mar 09, 2010 6:57 am
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: Re: ¿Se pueden incluir varios campos en un índice único MySQ
Anuncios
alonsojpd escribió:
Sí, por supuesto, si quieres que sea el motor de base de datos quien compruebe la unicidad de la tabla "factura" por el campo "anio" y "numero" puedes utilizar la siguiente consulta SQL de MySQL Server:
Código:
ALTER TABLE factura ADD UNIQUE INDEX factura_numero_anio (numero, anio);
Donde:
* factura_numero_anio: será el nombre del índice, le puedes poner el que quieras.
Ok, me ha funcionado perfectamente, ya no deja meter dos facturas con el mismo numero y anio. Sólo tengo otro pequeño problema, puesto que no sé capturar el error (si es que se puede), el programa que estoy realizando en Delphi me muestra un error un poco "desagradable" ¿puedo capturar sólo ese error (cuando se incumple el índice) y mostrar lo que quiera? utilizo Delphi 6 y ZeosDBO para la conexión con MySQL.
Publicado:
Mar Mar 09, 2010 7:00 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: ¿Se pueden incluir varios campos en un índice único MySQ
Anuncios
varios escribió:
Ok, me ha funcionado perfectamente, ya no deja meter dos facturas con el mismo numero y anio. Sólo tengo otro pequeño problema, puesto que no sé capturar el error (si es que se puede), el programa que estoy realizando en Delphi me muestra un error un poco "desagradable" ¿puedo capturar sólo ese error (cuando se incumple el índice) y mostrar lo que quiera? utilizo Delphi 6 y ZeosDBO para la conexión con MySQL.
Para capturar el error sigue estos pasos:
1. En el evento "OnPostError" del TZTable del ZeosDBO añade el siguiente código:
Código:
if e is EZDatabaseError then
begin
case EZDatabaseError(E).ErrorCode of
1062 : begin
MessageDlg ('Ya existe una factura con este número y año.',
mtWarning,[mbok],0);
end;
else
MessageDlg ('Se ha producido un error al intentar guardar el registro:' +
chr(13) + chr(13) + inttostr(EZDatabaseError(E).ErrorCode) +
' -> ' + E.Message, mtInformation,[mbok],0);
end;
Action := daAbort;
end;
Con esto podrás mostrar un aviso personalizado para cada excepción o error que se produzca y quieras capturar.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A