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

errores de sintraxis??

Estas en el tema de errores de sintraxis?? en el foro de Mysql en Foros del Web. Hola amigos, estoy creando una tabla en MySQL pero me da un error y no consigo verlo¡¡(todo parece estar bien),¿Me echaus una mano con el ...
  #1 (permalink)  
Antiguo 29/01/2016, 07:55
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
errores de sintraxis??

Hola amigos,
estoy creando una tabla en MySQL pero me da un error y no consigo verlo¡¡(todo parece estar bien),¿Me echaus una mano con el error?

Código MySQL:
Ver original
  1. create table CH(id auto_increment,name char(35) not null,countrycode char(3) not null,primary key (id),foreign key(countrycode) references CP(code) on update cascade on delete cascade);

El erro k obtengo es este:"ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'auto_increment,name char(35) not null,countrycode char(3) not null,primary key (' at line 1", pero por mas que examino el codigo no veo el error:(

¿Puede deberse a que no existe la tabla padre(CP)?¿Hay alguna forma de poder crear la tabla hija(CH) sin haber creado antes la tabla padre(CP)?

Gracias, saludos:D
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #2 (permalink)  
Antiguo 29/01/2016, 08:38
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, 5 meses
Puntos: 2658
Respuesta: errores de sintraxis??

Bueno, por lo pronto, AUTO_INCREEMENT no es un tipo de dato. Es un modificador o atributo de un tipo de columna, que no es lo mismo.
Por otro lado, debes tener cuidado con usar palabras reservadas en los nomrbes de columna, como por ejemplo "code", ya que pueden disparar errores de dificil detección..

Esto te debería funcionar:
Código MySQL:
Ver original
  1.     name CHAR(35) NOT NULL,
  2.     countrycode CHAR(3) NOT NULL,
  3.     PRIMARY KEY (ch_id),
  4.     FOREIGN KEY(countrycode) REFERENCES CP(code) ON UPDATE CASCADE ON DELETE CASCADE);
Nota que al tipo de columna INT le he agregado un modificador "UNSIGNED", para evitar números negativos, que el AI no genera, y que ademas si los dejas como posibles tienden a permitir errores de los INSERT manuales, además de cortarte el rango por la mitad.
Adicionalmente te recomiendo que NO USES nombres de columnas tan genéricos como ID, sino que les pongas como prefijo algo que las relacione con la tabla a que pertenecen. De ese modo evitarás errores en las consultas cuando tengas que cruzar dos o mas tablas donde hay campos que tienen el mismo nombre, lo que en los JOIN implícitos puede generar resultados erróneos.
__________________
¿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 29/01/2016, 09:23
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: errores de sintraxis??

Gracias por tu respuesta gnzsoloyo,

Te podias haber ahorrado(no te lo tomes mal) toda la parrafada diciendo que simplemente no indique el tipo de dato del campo 'id'(no se como no la vi con lo 'basica' que es), aunque agradezco tus recomendaciones a la hora de crear tablas sobre todo la de crear los auto_increment como unsigned(si no estaria desaprovechando todo el rango negativo del tipo de dato) tan logica y no habia caido en ella :D.
Código:
create table CH(id tinyint unsigned auto_increment,....);
El nombre generico 'id' no lo elegi yo, estoy siguiendo un ejemplo del libro y en la documentacion lo llaman asi(simplemente eso), pero ¿no crees que al hacer un JOIN de varias tablas(3-4) seria ventajoso en la condicion tener un campo de igual nombre en todas ellas?? seria tan simple como poner en la condicion ...USING(id), en lugar del 'infinito' ON
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #4 (permalink)  
Antiguo 29/01/2016, 12:13
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, 5 meses
Puntos: 2658
Respuesta: errores de sintraxis??

Cita:
El nombre generico 'id' no lo elegi yo, estoy siguiendo un ejemplo del libro y en la documentacion lo llaman asi(simplemente eso), pero ¿no crees que al hacer un JOIN de varias tablas(3-4) seria ventajoso en la condicion tener un campo de igual nombre en todas ellas?? seria tan simple como poner en la condicion ...USING(id), en lugar del 'infinito' ON
No exactamente... El campo debe tener el mismo nombre si y sólo si pertenece al mismo dominio, cosa que no suele suceder en la realidad.

Vamos a ver si se entiende:
Supongamos que tienes tres tablas: FACTURA, DETALLE_FACTURA y PRODUCTO, y que los tres usan el "ID" como PK.
Podrías tranquilamente hacer un
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM factura F
  3.     INNER JOIN detalle_factura DF USING(id)
  4.     INNER JOIN producto P USING(id)
  5. ...
Tal consulta no te daría error, pero...
FACTURA.ID es el numero de la factura.
DETALLE_FACTURA.ID es el numero de un item de la factura (suponiendo que no se reinicien las numeraciones por cada una)
PRODUCTO.ID es el numero de producto.

En ese contexto, estarías mezclando caballos, manzanas y serruchos, porque a una factura dada se la emparejaría con un item con igual numero, aunque no pertenezca a la misma factura, y con un producto cuyo numero sea igual al de la factura... que puede ser cualquiera, incluyendo los que no se facturaron en ella.

¿Se entiende la idea?

No es tan simple como poner un nombre estandarizado como ID, sino que el mismo nombre de la PK debe estar en la tabla donde la misma es FK...
¿Se entiende?
En ese contexto, si usas "ID" en una tabla, pero la otra tiene su propio campo "ID", no puedes hacerlo porque comparten nombres y son datos diferentes.
¿Qué haces entonces?
Pones ID en una tabla y donde es FK le pones, por ejemplo ID_PRODUCTO, con lo cual el USING ya no sirve.
Por ESO es que como regla de buenas prácticas, toda PK debe tener un sufijo o prefijo que identifique la tabla de origen, y le permita ser nombre único en toda la base.

En el ejemplo que te doy sería:
Cita:
FACTURA(factura_nro, ...)
DETALLE_FACTURA(factura_nro, ..., producto_id, ...)
PRODUCTO(producto_id, ...)
y en ese contexto, SI puedes escrbir:
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM factura F
  3.     INNER JOIN detalle_factura DF USING(factura_nro)
  4.     INNER JOIN producto P USING(producto_id)
  5. ...

Nota bene: Los libros, especialmente los que no son los manuales oficiales de referencia de un DBMS, están llenos de metidas de pata y ejemplos malos.
Para encontrar ejemplos correctos tienes que acudir a los manuales de referencia, donde raramente usan nombres de columna de esa clase...

Posdata: Escribo largo y detallado porque ese es mi estilo, y además como analista funcional de BBDD, tengo que escribir cosas para que las entiendan usuarios que no son de BBDD. Y entonces hay que ser detallado y meticuloso, incluso si parece redundante.

Además, me gusta nuestro idioma.
__________________
¿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 29/01/2016, 12:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: errores de sintraxis??

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Posdata: Escribo largo y detallado porque ese es mi estilo, y además como analista funcional de BBDD, tengo que escribir cosas para que las entiendan usuarios que no son de BBDD. Y entonces hay que ser detallado y meticuloso, incluso si parece redundante.

Además, me gusta nuestro idioma.
Una ovacion de pie para el maestro gnzsoloyo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: errores, sql, tabla
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.
Tema Cerrado




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