1

estoy creando un programa en java que se conecta a mysql 8.0.23 y utilizo netbeans. Soy nuevo programando aclaro.

stmt.executeUpdate("INSERT INTO clientes VALUES('auto_increment',"+tfNombre.getText()+"','"+tfApellido.getText()+"','"+tfCel.getText()+"','"+tfDomicilio.getText()+"','"+tfCiudad.getText()+"','"+tfDni.getText()+"','"+tfNotas.getText()+"')");

Estoy insertando esos datos, y la primera columna que dice 'auto_increment' creo que es el problema(lo puse para probarlo), ya que la columna se llama Id y la configure con phpmyadmin para que se autoincrementable. No se que valor poner ahi para que de un valor Id en la columna Id, ya intente con NULL null, 0, etc. El problema es que me da el siguiente error, y no se que valor poner el el codigo para que incremente el valor en 1. del ultimo que estaba en la columna.

ava.sql.SQLSyntaxErrorException: 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 '',' asdsad',' 3121','asdasd','adasd','21231','asadsad')' at line 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1333) at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2106) at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1243) at serviciotecnico.Registro.jButton2ActionPerformed(Registro.java:220) at serviciotecnico.Registro.access$100(Registro.java:20) at serviciotecnico.Registro$2.actionPerformed(Registro.java:117) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6539) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304)

Cita en bloque

  • Puedes mostrar la estructura de la tabla? tiene habilitado el auto increment en la tabla? en el insert que eestas enviando no debería ir ese 'auto_increment' ya que en MySQLal habilitar la opción el por defecto hará el trabajo. – BlackHat Mar 14 '21 at 00:46
  • Puedes poner `NULL` (o sea `NULL` en cuanto valor, no la cadena `"NULL"` ) o puedes omitir esa columna en la instrucción de inserción, evitando así la **mala práctica** de no usar nombres de columnas de forma explícita en tus instrucciones SQL. Al ser auto-increment, se incrementará sola, por supuesto. – A. Cedano Mar 14 '21 at 00:46
  • 1
    [En esta respuesta](https://es.stackoverflow.com/a/431515/29967) he dado algunos motivos por los que nunca deberías escribir consultas INSERT sin poner de forma explícita los nombres de columna. Allí hay un ejemplo de inserción precisamente usando la columna `id` que es auto-increment. Aunque allí era en PHP el concepto es el mismo. – A. Cedano Mar 14 '21 at 00:52
  • `"INSERT INTO clientes VALUES(null,"`. Con el exhorto a usar columnas nombradas y sentencias preparadas. – Sal Mar 14 '21 at 21:42
  • Bueno gracias a todos la verdad que lei a todos y me di cuenta que muchos me indicaban que poniendo NULL lo solucionaba y era cierto, pero tambien sin utilizar NULL como me indico el usuario Jorgesys tambien pude solucionarlo. Mi erraro estaba en que me faltaba una comilla simple ' en donde agregaba "+tfNombre.getText()+"' me faltaba iniciar la comilla simple '. Desde ya muchas gracias porque he aprendido como utilizar bien esta funcion mysql – Cesar Barboza Rueda Mar 15 '21 at 15:14

1 Answers1

1

Para definir tu campo id como auto incrementable debes definirlo al crear tu tabla, como en este ejemplo el campo id es auto incrementable:

CREATE TABLE personas (
     id INT NOT NULL AUTO_INCREMENT,
     nombre CHAR(30) NOT NULL,
     apellido CHAR(30) NOT NULL,
     edad INT
);

lo importante aquì es que al definir el campo como incrementable no necesitas tratar de insertarlo, ejemplos:

INSERT INTO personas (nombre,apellido,edad) VALUES('Cesar', 'Barbosa', 22);
INSERT INTO personas (nombre,apellido,edad) VALUES('Jorge', 'sys', 31);

el valor de id automàticamente serà un valor incrementado en 1, por lo tanto no necesitas definir un valor en este campo, solo define actualizar los demàs campos.

Revisa la documentaciòn:

https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

Otro problema que tienes es que si tienes campos de tipo CHAR debes usar el como contenedor las comillas simples (') y en este punto falta la del lado izquierdo:

... ,"+tfNombre.getText()+"', ...

deberìa ser:

... ,'"+tfNombre.getText()+"', ...

Recuerda que no es recomendable usar palabras reservadas como nombres o valores de campos, te lo comento por el valor "auto_increment".

Como comenta @A.Cedano debes tambièn preparar tus querys (consultas) para evitar la inyecciòn SQL, revisa:

¿Qué es la inyección SQL y cómo puedo evitarla?

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
  • 1
    Y, debería usar consultas preparadas para blindar el código contra ataques de *Inyección SQL*. – A. Cedano Mar 14 '21 at 20:24
  • 1
    Muy cierto @A.Cedano , muchas gracias, actualicè la respuesta con un articulo de Alvaro Montoro con lo que comentas. – Jorgesys Mar 14 '21 at 21:17
  • 1
    Muchas gracias Jorgesys, al leer todos los comentario pude darme cuenta que faltaba ese ' simple y era el error de todo, igualmente probé utilizando NULL sin comillas y funciono el ingreso de datos, pero como me dijiste que podía obviarlo lo deje directamente sin NULL. Desde ya muchas gracias. – Cesar Barboza Rueda Mar 15 '21 at 15:17