Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Estas en el tema de aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql en el foro de Mysql en Foros del Web. HOLA ME PUEDEN AYUDAR ES URGENTE ESTOY DESARROLLAND UN PROGRAMA Y AL MOMENTO DE ENVIAR A GUARADAR ME SALE UN ERROR ES ESTE: run: USO ...
  #1 (permalink)  
Antiguo 26/11/2009, 21:03
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

HOLA ME PUEDEN AYUDAR
ES URGENTE ESTOY DESARROLLAND UN PROGRAMA Y AL MOMENTO DE ENVIAR A GUARADAR ME SALE UN ERROR ES ESTE:
run:

USO netbeans con mysql

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value adjusted for column 'cod_autor' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3374)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3308)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:18 37)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java :1961)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionIm pl.java:2537)
at com.mysql.jdbc.StatementImpl.executeUpdate(Stateme ntImpl.java:1564)
at com.mysql.jdbc.StatementImpl.executeUpdate(Stateme ntImpl.java:1485)
at biblioteca.LIBRO.jMGuardarActionPerformed(LIBRO.ja va:351)
at biblioteca.LIBRO.access$1500(LIBRO.java:29)
at biblioteca.LIBRO$16.actionPerformed(LIBRO.java:237 )
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton. java:302)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Bas icMenuItemUI.java:1000)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mou seReleased(BasicMenuItemUI.java:1041)
at java.awt.Component.processMouseEvent(Component.jav a:5488)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3126)
at java.awt.Component.processEvent(Component.java:525 3)
at java.awt.Container.processEvent(Container.java:196 6)
at java.awt.Component.dispatchEventImpl(Component.jav a:3955)
at java.awt.Container.dispatchEventImpl(Container.jav a:2024)
at java.awt.Component.dispatchEvent(Component.java:38 03)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3822)
at java.awt.Container.dispatchEventImpl(Container.jav a:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1778 )
at java.awt.Component.dispatchEvent(Component.java:38 03)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 463)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:110)

TENGO UNA TABLA LIBRO, AUTOR, EDITORIAL

LA TABLA LIBRO LA CUAL TIEN COMO CLAVES FORANEAS COD_AUTOR Y COD_EDITORIAL

HICE EL CODIGO PARA SOLO ESCOJER UNA OPCION, DE UN CHOICE.
ESTE ES EL CODIGO

EL CODIGO GUARDAR
cod=Integer.parseInt(txt_codigo.getText());
nombre=txt_nombre.getText();
tema=txt_tema.getText();
descripcion=txt_descripcion.getText();
año=txt_publicacion.getText();
num=txt_numero.getText();
autor=cmb_autor.getSelectedItem();
editorial=cmb_editorial.getSelectedItem();


try {
DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
//Class.forName("com.mysql.jdbc.Driver");

Connection conexiones = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/biblioteca","root", "root");
Statement s = conexiones.createStatement();
s.executeUpdate("INSERT INTO libro( cod_libro,nom_libro,tema_libro,desc_libro,año_libr o,num_libro,cod_autor,cod_editorial) VALUES ('"+cod+"','"+nombre+"','"+tema+"','"+desc+"','" +a ño+"','"+num+"','"+autor+"','"+editorial+"')");
conexiones.close();
} catch (Exception e) {
e.printStackTrace();
}

EL CODIGO DEL CHOICE

private void cmb_autorMousePressed(java.awt.event.MouseEvent evt) {

try
{
DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
Connection conexiones = DriverManager.getConnection (
"jdbc:mysql://localhost:3306/biblioteca","root","root");

ResultSet rs = null;
Statement s = conexiones.createStatement();
String query = "select *from autor";
rs = s.executeQuery(query);

cmb_autor.removeAll();

while(rs.next())
{
cmb_autor.addItem(rs.getString(2));

}
conexiones.close();
}
catch (Exception e)
{
e.printStackTrace();

}
}


POR FAVOR NECESITO AYUDA URGENTE HICE DE TODO PERO YA NO SE QUE ES LO QUE PASA

AGRADECERIA SU GENTILEZA DE AYUDARME TENGOQ UE ENTREGAR YA MAÑANA Y ME HACE FALTA SOLO ESTO
  #2 (permalink)  
Antiguo 26/11/2009, 21:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Tu problema no es de programación (por cierto, en este foro no se debe poner código de programación, son reglas del Foro); tu problema es que no planeaste correctamente la estructura de los datos de la tabla, o bien no validaste correctamente los datos entrantes en el formulario.
Esto:
Cita:
Data truncation: Out of range value adjusted for column 'cod_autor' at row 1
dice que el dato que estás ingresando en la columna 'cod_autor' excede el rango del campo en el que quieres ingresarlo.
Esto puede darse en varias situaciones. Como no has posteado la estructura de la tabla, no estoy muy seguro cuál es la correcta.
- Suponiendo que 'cod_autor' sea un campo numérico, puede ser rango numérico incorrecto, dependiendo si es un TINYINT, SMALLINT, MEDIUMINT, INT o BIGINT, el rango cambia; y si es UNSIGNED y le pones un negativo, también.
- Si es de caracteres, y le has puesto menos caracteres de lo que le mandas, también.
- Si es un TIME y le mandas un DATETIME, puede que también, así como si le pones un formato de fecha incorrecto (dd/mm/aaaa en lugar de aaaaa/mm/dd).

En fin, lo que sea de que se trate, es que has definido mal la tabla, o no estás validando correctamente los datos.


Por favor, no pongas código de programación. Resulta difícil separar los errores del usuario de los defectos de un lenguaje que no todos manejamos. En el Foro de Bases de Datos solamente trabajamos con SQL.

Suerte con el trabajo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/11/2009, 22:17
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

muchas gracias por la observacion fue ese problema pero me pueds ayudar con las claves foraneas de 1 a n soy nuevo en mysql y npo lo entiendo te envio el scrip de mi base si ni es mucha molestia por favor revisale para ver las claves foranes te agradezco estoy sobre tiempo

MySQL Administrator dump 1.4
--
-- ------------------------------------------------------
-- Server version 5.0.19-nt


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;


--
-- Create schema biblioteca
--

CREATE DATABASE IF NOT EXISTS biblioteca;
USE biblioteca;

--
-- Definition of table `autor`
--

DROP TABLE IF EXISTS `autor`;
CREATE TABLE `autor` (
`cod_autor` int(10) unsigned NOT NULL auto_increment,
`nom_autor` varchar(45) NOT NULL,
`ape_autor` varchar(45) NOT NULL,
PRIMARY KEY (`cod_autor`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `autor`
--

/*!40000 ALTER TABLE `autor` DISABLE KEYS */;
INSERT INTO `autor` (`cod_autor`,`nom_autor`,`ape_autor`) VALUES
(1,'Carlos','Garces'),
(2,'Esteban','CArlosama'),
(3,'Jose','Avila');
/*!40000 ALTER TABLE `autor` ENABLE KEYS */;


--
-- Definition of table `editorial`
--

DROP TABLE IF EXISTS `editorial`;
CREATE TABLE `editorial` (
`cod_editorial` int(10) unsigned NOT NULL auto_increment,
`nom_editorial` varchar(45) NOT NULL,
`direccion_editorial` varchar(45) NOT NULL,
`email_editorial` varchar(45) default NULL,
`telf_editorial` varchar(10) NOT NULL,
PRIMARY KEY (`cod_editorial`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `editorial`
--

/*!40000 ALTER TABLE `editorial` DISABLE KEYS */;
INSERT INTO `editorial` (`cod_editorial`,`nom_editorial`,`direccion_editor ial`,`email_editorial`,`telf_editorial`) VALUES
(1,'LOS ANDES','ibarra','[email protected]','062956241'),
(2,'offset ','QUito','[email protected]','062356548'),
(3,'Caritas','GUayaquil','[email protected]','09 8745855');
/*!40000 ALTER TABLE `editorial` ENABLE KEYS */;


--
-- Definition of table `libro`
--

DROP TABLE IF EXISTS `libro`;
CREATE TABLE `libro` (
`cod_libro` int(10) unsigned NOT NULL auto_increment,
`nom_libro` varchar(45) NOT NULL,
`tema_libro` varchar(45) NOT NULL,
`desc_libro` varchar(400) default NULL,
`año_libro` varchar(45) default NULL,
`num_libro` varchar(4) NOT NULL,
`cod_autor` int(10) unsigned NOT NULL,
`cod_editorial` int(10) unsigned NOT NULL,
PRIMARY KEY (`cod_libro`),
KEY `FK_cod_autor` (`cod_autor`),
KEY `FK_cod_editorial` (`cod_editorial`),
CONSTRAINT `FK_cod_autor` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_cod_editorial` FOREIGN KEY (`cod_editorial`) REFERENCES `editorial` (`cod_editorial`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `libro`
--

/*!40000 ALTER TABLE `libro` DISABLE KEYS */;
INSERT INTO `libro` (`cod_libro`,`nom_libro`,`tema_libro`,`desc_libro` ,`año_libro`,`num_libro`,`cod_autor`,`cod_editoria l`) VALUES
(1,'fisica','cinematica','fundamentos de fisica','1995','2',1,2),
(2,'matematica','ecuaciones','ecuaciones inecuaciones','1994','1',2,3),
(3,'Quimica general','Fundamentos de Quimica','quimica general','2002','1',3,1);
/*!40000 ALTER TABLE `libro` ENABLE KEYS */;


--
-- Definition of table `presta_libro`
--

DROP TABLE IF EXISTS `presta_libro`;
CREATE TABLE `presta_libro` (
`fecha_presta` varchar(20) NOT NULL,
`fecha_devo` varchar(20) default NULL,
`cod_libro` int(10) unsigned NOT NULL,
`ci_usuario` int(10) unsigned NOT NULL,
KEY `FK_cod_libro` (`cod_libro`),
KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `presta_libro`
--

/*!40000 ALTER TABLE `presta_libro` DISABLE KEYS */;
INSERT INTO `presta_libro` (`fecha_presta`,`fecha_devo`,`cod_libro`,`ci_usuar io`) VALUES
('10/10/2008','',1,1002985362),
('10/11/2008','',2,1002985363);
/*!40000 ALTER TABLE `presta_libro` ENABLE KEYS */;


--
-- Definition of table `usuario`
--

DROP TABLE IF EXISTS `usuario`;
CREATE TABLE `usuario` (
`ci_usuario` int(10) unsigned NOT NULL auto_increment,
`nom_usuario` varchar(45) NOT NULL,
`ape_usuario` varchar(45) NOT NULL,
`dir_usuario` varchar(45) NOT NULL,
`email_usuario` varchar(45) default NULL,
`tel_usuario` varchar(10) default NULL,
PRIMARY KEY (`ci_usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `usuario`
--

/*!40000 ALTER TABLE `usuario` DISABLE KEYS */;
INSERT INTO `usuario` (`ci_usuario`,`nom_usuario`,`ape_usuario`,`dir_usu ario`,`email_usuario`,`tel_usuario`) VALUES
(1002985362,'Andres','Castillo','ibarra','andres@h otmail.com','062932860'),
(1002985363,'Carla','Andrade','los ceibos','[email protected]','062956321'),
(1002985364,'Diego','CArlos','Guayaquil','diego@ho tmail.com','062458792'),
(1002985367,'asd','asdaa','ASDASD','062932879','as dasd');
/*!40000 ALTER TABLE `usuario` ENABLE KEYS */;




/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  #4 (permalink)  
Antiguo 26/11/2009, 22:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

¿ Y en qué consiste exactamente tu duda?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/11/2009, 23:22
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

en como ubicar las claves foráneas de 1 a n en la tabla 1 autor varios libros no pude colocarles solo se ponen 1 a 1 y no lo entiendo como se lo hace en mysql gracias esa es toda mi base y tu crees que debo crear otra tabla q se llame préstamo libros con todos los datos de quien pide y los datos del libro corrígeme por favor no entiendo es parte por que le iba a sacar un reporte, pero al momento de hacer la consulta sobre el libro si esta o no me imagino va a haber problemas
  #6 (permalink)  
Antiguo 26/11/2009, 23:41
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

se donde van pewro lo que no entiendo es como declarar las foraneas de 1 a n
  #7 (permalink)  
Antiguo 26/11/2009, 23:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Si la cardinalidad es 1:1, una FK va en una tabla. Es indistinto en cual, pero en ese caso es preferible no ponerla en la de mayor jerarquía o importancia. Especialmente en aquellas que no dependan de otra.
SI es 1:N, la FK se pone en la tabla de cardinalidad N.
Si es N:N, la relación crea una tabla nueva donde estén las dos claves como parte de la PK.

En tu caso la relación de Préstamo está bien establecida, lo que le falta es una PK, que podría ser las 2 FK más la fecha del préstamo. De lo contrario tendrás que poner un campo ID numérico autoincremental.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 27/11/2009, 00:14
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

claro eso esta entendido, las relaciones de 1 a n, por favor mepuedes ayudar en esta tabla para ver como se hace? y corregirla por favor??

CREATE TABLE `libro` (
`cod_libro` int(10) unsigned NOT NULL auto_increment,
`nom_libro` varchar(45) NOT NULL,
`tema_libro` varchar(45) NOT NULL,
`desc_libro` varchar(400) default NULL,
`año_libro` varchar(45) default NULL,
`num_libro` varchar(4) NOT NULL,
`cod_autor` int(10) unsigned NOT NULL,
`cod_editorial` int(10) unsigned NOT NULL,
PRIMARY KEY (`cod_libro`),
KEY `FK_cod_autor` (`cod_autor`),
KEY `FK_cod_editorial` (`cod_editorial`),
CONSTRAINT `FK_cod_autor` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_cod_editorial` FOREIGN KEY (`cod_editorial`) REFERENCES `editorial` (`cod_editorial`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  #9 (permalink)  
Antiguo 27/11/2009, 05:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Código sql:
Ver original
  1. CREATE TABLE `libro` (
  2. `cod_libro` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nom_libro` VARCHAR(100) NOT NULL,
  4. `tema_libro` VARCHAR(100) NOT NULL,
  5. `desc_libro` VARCHAR(400) DEFAULT NULL,
  6. `año_libro` SMALLINT UNSIGNED DEFAULT NULL,
  7. `num_libro` VARCHAR(4) NOT NULL,
  8. `cod_autor` INT(10) UNSIGNED NOT NULL,
  9. `cod_editorial` INT(10) UNSIGNED NOT NULL,
  10. PRIMARY KEY (`cod_libro`),
  11. KEY `FK_cod_autor` (`cod_autor`),
  12. KEY `FK_cod_editorial` (`cod_editorial`),
  13. CONSTRAINT `FK_cod_autor` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_editorial` FOREIGN KEY (`cod_editorial`) REFERENCES `editorial` (`cod_editorial`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En términos generales, la tabla esta bien definida. El problema está en el modelado lógico: No puedes establecer una relación de tipo N:1 entre Libro y Autor, porque un libro puede tener uno o más de un autor, y cada autor puede tener a su vez uno o más libros. Es una relación N:N, con lo que se debe crear una tabla que la regule y que contenga ambas claves, digamos LIBRO_AUTOR.

Una nota que te puedo hacer es que hay muchos campos con los tipos mal definidos, como por ejemplo, las fechas.
Las fechas las estás definiendo como VARCHAR(20), lo cual no sólo es un desperdicio de espacio, sino que además te dará problemas a la hora de las búsquedas por año, meses o días, ya que tendrás que usar funciones de conversión entre caracteres y fecha. Esto no hace más que impactar sobre la performance, por más que no se note con tablas de pocos registros.
Veamos el caso:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` VARCHAR(20) NOT NULL,
  8. `fecha_devo` VARCHAR(20) DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

En este caso ambas fechas deberían ser Datetime, sobre todo si la devoluvión de los libros tiene una hora de cierre antes de su penalización.
Podría quedar:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` DATETIME NOT NULL,
  8. `fecha_devo` DATETIME DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En esta tabla, además, está faltando la PK, que bien podría ser la fecha+codigo de usuario + código de libro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 27/11/2009, 09:31
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código sql:
Ver original
  1. CREATE TABLE `libro` (
  2. `cod_libro` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nom_libro` VARCHAR(100) NOT NULL,
  4. `tema_libro` VARCHAR(100) NOT NULL,
  5. `desc_libro` VARCHAR(400) DEFAULT NULL,
  6. `año_libro` SMALLINT UNSIGNED DEFAULT NULL,
  7. `num_libro` VARCHAR(4) NOT NULL,
  8. `cod_autor` INT(10) UNSIGNED NOT NULL,
  9. `cod_editorial` INT(10) UNSIGNED NOT NULL,
  10. PRIMARY KEY (`cod_libro`),
  11. KEY `FK_cod_autor` (`cod_autor`),
  12. KEY `FK_cod_editorial` (`cod_editorial`),
  13. CONSTRAINT `FK_cod_autor` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_editorial` FOREIGN KEY (`cod_editorial`) REFERENCES `editorial` (`cod_editorial`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En términos generales, la tabla esta bien definida. El problema está en el modelado lógico: No puedes establecer una relación de tipo N:1 entre Libro y Autor, porque un libro puede tener uno o más de un autor, y cada autor puede tener a su vez uno o más libros. Es una relación N:N, con lo que se debe crear una tabla que la regule y que contenga ambas claves, digamos LIBRO_AUTOR.

Una nota que te puedo hacer es que hay muchos campos con los tipos mal definidos, como por ejemplo, las fechas.
Las fechas las estás definiendo como VARCHAR(20), lo cual no sólo es un desperdicio de espacio, sino que además te dará problemas a la hora de las búsquedas por año, meses o días, ya que tendrás que usar funciones de conversión entre caracteres y fecha. Esto no hace más que impactar sobre la performance, por más que no se note con tablas de pocos registros.
Veamos el caso:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` VARCHAR(20) NOT NULL,
  8. `fecha_devo` VARCHAR(20) DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

En este caso ambas fechas deberían ser Datetime, sobre todo si la devoluvión de los libros tiene una hora de cierre antes de su penalización.
Podría quedar:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` DATETIME NOT NULL,
  8. `fecha_devo` DATETIME DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En esta tabla, además, está faltando la PK, que bien podría ser la fecha+codigo de usuario + código de libro.


hola nuevamente ahora si que me confundi!!!!!! ahh gracia spor lo de las date nno me habia dado cuenta
mira lo que quiero hacer es lo siguiente

necesito

tengo la tabla

-usuario: cod_usuario, nombre,apellido,direccion.
-libro:cod_libro,nombre,tema,descripcion,"este debe tener el autor y el editor"
-editorial: cod_editorial, nombre, dirección, etc.
-presta_libro:

ahora debo crear la tabla autor/libro y en este caso el editorial donde se queda ya que un editorial puede tener varios libros seria n:n

estoy que no se como.
puedes porfavor darme un explicacion mas detallada.
  #11 (permalink)  
Antiguo 27/11/2009, 09:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Cita:
ahora debo crear la tabla autor/libro y en este caso el editorial donde se queda ya que un editorial puede tener varios libros seria n:n
Es innecesario porque la relación con cada libro es 1:N (una editorial tiene N libros, pero cada libro es de una sola editorial). Eso contando con que por cada entrada de un libro estamos refiriéndonos a un objeto físico. En ese caso pueden existir 900 entradas correspondientes a 900 ejemplares de "Cien años de soledad", por ejemplo, de varias editoriales.
No estás haciendo una tabla para manejar libros como entidad abstracta, sino libros como entidad física. Son los libros que tienes en los estantes de la biblioteca...
Si quisieras relacionar una sola entrada de libro con la editorial, implicaría que tienes otra tabla donde se indica número de copia, estantería, estante, estado, fecha de ingreso, etc., de cada ejemplar.
Si no vas a crear ese nivel de atomización, la tabla libro_editorial no se necesita.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 27/11/2009, 12:13
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

hola
porfavor puedes darme un punto de vista sobre este nuevo diseño, estuve siguiendo tus observaqciones

*================================================= =============*/
/* Table: AUTOR */
/*================================================= =============*/
create table AUTOR
(
COD_AUTOR integer not null,
NOM_AUTOR varchar(40),
APE_AUTOR varchar(40),
primary key (COD_AUTOR)
);

/*================================================= =============*/
/* Table: AUTOR_LIBRO */
/*================================================= =============*/
create table AUTOR_LIBRO
(
COD_AUTOR integer not null,
COD_LIBRO integer not null,
primary key (COD_AUTOR, COD_LIBRO)
);

/*================================================= =============*/
/* Index: RELATIONSHIP_1_FK */
/*================================================= =============*/
create index RELATIONSHIP_1_FK on AUTOR_LIBRO (
COD_AUTOR ASC
);

/*================================================= =============*/
/* Index: RELATIONSHIP_2_FK */
/*================================================= =============*/
create index RELATIONSHIP_2_FK on AUTOR_LIBRO (
COD_LIBRO ASC
);

/*================================================= =============*/
/* Table: EDITORIAL */
/*================================================= =============*/
create table EDITORIAL
(
COD_EDITORIAL integer not null,
NOM_EDITORIAL varchar(40),
DIR_EDITORIAL varchar(40),
EMAIL_EDITORIAL varchar(40),
TELF_EDITORIAL varchar(9),
primary key (COD_EDITORIAL)
);

/*================================================= =============*/
/* Table: LIBRO */
/*================================================= =============*/
create table LIBRO
(
COD_LIBRO integer not null,
COD_EDITORIAL integer,
NOM_LIBRO varchar(40),
TEMA_LIBRO varchar(100),
DESC_LIBRO varchar(800),
ANO_LIBRO varchar(4),
primary key (COD_LIBRO)
);

/*================================================= =============*/
/* Index: RELATIONSHIP_5_FK */
/*================================================= =============*/
create index RELATIONSHIP_5_FK on LIBRO (
COD_EDITORIAL ASC
);

/*================================================= =============*/
/* Table: PRESTA_LIBRO */
/*================================================= =============*/
create table PRESTA_LIBRO
(
COD_LIBRO integer,
CI_USUARIO integer,
FECHA_PRESTA timestamp,
FECHA_DEVO timestamp
);

/*================================================= =============*/
/* Index: RELATIONSHIP_3_FK */
/*================================================= =============*/
create index RELATIONSHIP_3_FK on PRESTA_LIBRO (
CI_USUARIO ASC
);

/*================================================= =============*/
/* Index: RELATIONSHIP_4_FK */
/*================================================= =============*/
create index RELATIONSHIP_4_FK on PRESTA_LIBRO (
COD_LIBRO ASC
);

/*================================================= =============*/
/* Table: USUARIO */
/*================================================= =============*/
create table USUARIO
(
CI_USUARIO integer not null,
NOM_USUARIO varchar(40),
APE_USUARIO varchar(40),
DIR_USUARIO varchar(40),
EMAIL_USUARIO varchar(40),
TELF_USUARIO varchar(40),
primary key (CI_USUARIO)
);

alter table AUTOR_LIBRO
add foreign key FK_AUTOR_LI_RELATIONS_AUTOR (COD_AUTOR)
references AUTOR (COD_AUTOR)
on update restrict
on delete restrict;

alter table AUTOR_LIBRO
add foreign key FK_AUTOR_LI_RELATIONS_LIBRO (COD_LIBRO)
references LIBRO (COD_LIBRO)
on update restrict
on delete restrict;

alter table LIBRO
add foreign key FK_LIBRO_RELATIONS_EDITORIA (COD_EDITORIAL)
references EDITORIAL (COD_EDITORIAL)
on update restrict
on delete restrict;

alter table PRESTA_LIBRO
add foreign key FK_PRESTA_L_RELATIONS_USUARIO (CI_USUARIO)
references USUARIO (CI_USUARIO)
on update restrict
on delete restrict;

alter table PRESTA_LIBRO
add foreign key FK_PRESTA_L_RELATIONS_LIBRO (COD_LIBRO)
references LIBRO (COD_LIBRO)
on update restrict
on delete restrict;
  #13 (permalink)  
Antiguo 27/11/2009, 12:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

En general está bien. Hay que volver a armarlo en MySQL para poner las cláusulas de AUTO_INCREMENT, por ejemplo.

Quedan pequeñeces en cuanto a tipos de dato:
- Los teléfonos deben ser VARCHAR, si, pero VARCHAR(9) es poco si va a contener numeros internacionales. Lo óptimo es VARCHAR(14).
- ANO_LIBRO VARCHAR(4) no es buena idea. Los datos numéricos es mejor almacenarlos como lo que son. Además, estás poniendo 4 bytes, cuando un SMALLINT UNSIGNED, que alcanza a los 655536, sólo necesita 2 bytes. Ahorras disco y volumen de datos transferidos.
- Email, es mejor dejarlos de 255 caracteres o al menos 100, 40 es poco: EMAIL_EDITORIAL VARCHAR(100).
- Si vas a usar tanto como 800 bytes en un VARCHAR, mejor usa TEXT o BLOB: DESC_LIBRO TEXT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:59.