com.mysql.jdbc. exceptions.jdbc4.MySQLSyntaxErrorExcepción: Valor predeterminado inválido para 'ver_date '

Tenemos un archivo de especificaciones que especifica la estructura de mesa y el programa java crea la tabla sobre la instalación, El archivo de espectro es como abajo,

customer {
    attributes = [
        { name : custId, type ="string:100" , key=true}
        { name : ver-date, type: timestamp , key=true}
        { name : updates, type = "string:8000" }
        { name : created-date, type : timestamp }
        { name : created-userId, type = "string:200" }
        { name : verifier-userId, type = "string:200" }
        { name : remark, type = "string:8000" }
    ]
}

The corresponding generated create statment fails with error as below as below,
Query executed : CREATE TABLE `customer` ( 
`verifier_userId` VARCHAR(200) binary ,
`custId` VARCHAR(100) binary ,
 `remark` VARCHAR(8000) binary ,
 `created_date` timestamp  NULL,
 `ver_date` timestamp ,
 `updates` VARCHAR(8000) binary ,
 `created_userId` VARCHAR(200) binary ,
  primary key (`custId`,`ver_date`))
**com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Invalid default value for 'ver_date'**
at sun.reflect.GeneratedConstructorAccessor6.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2124)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2058)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5158)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2043)
at     com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:384)

El problema parece que el ver_date no se da un valor predeterminado cuando es una clave primaria, ya que no puede tener null también.

El reto aquí es que no podemos cambiar el archivo de espectro, así como el programa de java que está generando la "declaración creada".

La versión de la base de datos utilizada es la siguiente: mysql Ver 14.14 Distrib 5.7.29, para Linux (x86_64) utilizando el envoltorio EditLine

¿Hay alguna configuración en el servidor de bases de datos que impactará esto y se puede modificar para asegurar que funcione? Realmente aprecia la ayuda.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por stackscripter


3 Respuestas:

  • Hemos mantenido el sql_mode tan vacío y entonces funcionó.

    Respondida el Dec 17, 2020 a las 16:55 - por scriptsorcerer4f7e

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que el campo 'ver_date' está definido como parte de la clave primaria de la tabla 'customer' y no se le está asignando un valor por defecto. En MySQL, cuando un campo forma parte de una clave primaria, no se le puede asignar un valor nulo y tampoco se le puede asignar un valor por defecto.

    Dado que mencionas que no puedes cambiar el archivo de especificaciones ni el programa Java que genera la sentencia de creación de la tabla, una posible solución sería modificar la sentencia SQL generada antes de ejecutarla en la base de datos. Puedes hacerlo agregando una cláusula que especifique que 'ver_date' no puede ser nulo y eliminando la asignación de valor predeterminado.

    Aquí te dejo un ejemplo de cómo podrías modificar la sentencia SQL generada:

    sql CREATE TABLE `customer` ( `verifier_userId` VARCHAR(200) binary , `custId` VARCHAR(100) binary , `remark` VARCHAR(8000) binary , `created_date` timestamp NULL, `ver_date` timestamp NOT NULL, `updates` VARCHAR(8000) binary , `created_userId` VARCHAR(200) binary , primary key (`custId`,`ver_date`) );

    Al especificar ver_date como NOT NULL, garantizas que siempre tenga un valor y cumpla con las restricciones de clave primaria.

    Espero que esta solución te ayude a resolver el problema. Si tienes alguna otra pregunta o inquietud, no dudes en decírmelo.

    Respondida el Dec 18, 2020 a las 17:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Solución:

    Modifica la configuración del servidor MySQL para permitir valores predeterminados nulos para columnas clave primarias.

    Pasos:

    • Accede a la consola de MySQL como usuario root.
    • Ejecuta el siguiente comando para abrir el archivo de configuración:
    
    vim /etc/mysql/my.cnf
    
    • Busca la sección `[mysqld]` y añade o modifica la siguiente línea:
    
    sql_mode=NO_ENGINE_SUBSTITUTION
    
    • Guarda los cambios y cierra el archivo.
    • Reinicia el servidor MySQL:
    
    sudo systemctl restart mysql
    

    Después de reiniciar, la configuración se aplicará y se permitirán valores predeterminados nulos para columnas clave primarias.

    Explicación:

    El valor predeterminado de sql_mode incluye ENGINE_SUBSTITUTION, que prohíbe valores predeterminados nulos para columnas clave primarias. Al establecer sql_mode=NO_ENGINE_SUBSTITUTION, desactivas esta restricción y permites valores predeterminados nulos.

    Notas:

    Esta solución solo es aplicable si tienes acceso al servidor MySQL y puedes modificar el archivo de configuración. Asegúrate de comprender las implicaciones de modificar sql_mode antes de hacerlo. * Considera hacer una copia de seguridad de la base de datos antes de realizar cualquier cambio.

    Respondida el Dec 18, 2020 a las 17:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0