[SOLUCIONADO] mysql no usa la variable por defecto cuando no se inserta nada

Iniciado por gAb1, 3 Abril 2016, 05:42 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Hola buenas, estoy teniendo complicaciones para configurar las tablas de mi base de datos y poder trabajar correctamente con la aplicación web php.

Por ejemplo, en un INSERT que hago a X tabla, algunas variables pueden no existir (!isset) por lo que mysql debería introducir en el campo el valor default que se le especifica a la columna cuando se crea la tabla.

Yo uso sqlyog community para crear y gestionar las tablas, y las columnas que pueden ser opcionales les puse un valor default para que no se quede (NULL) y no haya problemas al hacer los select y comprobar el valor. Al principio probé activando la opción "Not Null?" pero al parecer si la variable a insertar no existe da error (diciendo que no puede ser null) pero debería usar el default. Probé desactivando dicha opción pero nada, se sigue quedando la columna (NULL) cuando se insertan variables opcionales que no están declaradas.

¿Cual creeis que puede ser el problema? A lo mejor me creo que el default sirve para esto pero resulta que es para otra cosa (aunque no lo creo)...

Gracias!

xiruko

Hola,

Si tienes una columna con un valor por defecto, y quieres que al hacer INSERT esa columna tome ese valor, simplemente no la pongas en la consulta.

Por ejemplo, supongamos que tienes una tabla de usuarios con los campos nombre, apellido y bloqueado, y por defecto la columna bloqueado es 0. Si quieres introducir un usuario que esté bloqueado harías:

Código (sql) [Seleccionar]
INSERT INTO usuarios (`nombre`, `apellido`, `bloqueado`)
VALUES ('Foo', 'Bar', '1');


Pero si quieres que bloqueado coja el valor por defecto, entonces harías:

Código (sql) [Seleccionar]
INSERT INTO usuarios (`nombre`, `apellido`)
VALUES ('Foo', 'Bar');


Saludos!

gAb1

Gracias por responder, pero no era eso lo que queria decir.

El problema creo que es más bien de html o php (es de html pero se soluciona con php...).

Lo que queria decir es que las variables que uso en el insert pueden no estar declaradas ya que son opcionales:

Tengo un formulario de 5 checkboxes y hago un insert a la tabla:

Código (php) [Seleccionar]
if ($stmt = $mysqli->prepare('INSERT INTO checkboxes (checkbox1, checkbox2, checkbox3, checkbox4, checkbox5) VALUES (?, ?, ?, ?, ?)')) {
    $stmt->bind_param('iiiii', $checkbox1, $checkbox2, $checkbox3, $checkbox4, $checkbox5);
    $stmt->execute();
}


Al ser checkboxes, si no están marcados no se envia nada por lo tanto la variable no se genera y se inserta NULL en la columna.

¿Hay alguna manera de decirle a mysql que si la variable es NULL se inserte el valor por defecto?

HdM


- Nice to see you again -

gAb1

Eso era exactamente lo que necesitaba, gracias.

¿Se puede hacer asi?

Código (sql) [Seleccionar]
VALUES (IFNULL(?, ?, ?, ?, ?, DEFAULT(0)))

A lo mejor es más sencillo usar un operador ternario...

eLank0

¿Y si cuando creas la tabla, le pones valores por defecto a los campos que quieras que lo tengan?

Salu2

gAb1

Eso es precisamente lo que ya tengo hecho, pero que sin embargo no funciona como me esperaba. Yo configuro una tabla para que sus columnas que puedan ser opcionales tengan un valor default que es el que debería utilizar en caso de que el valor a insertar sea null. Esa es la razón por la que abrí este mensaje.

Le tuve que quitar la opción Not Null? porque daba error al insertar una variable nula.


HdM

Hola.

Pero es que ambos comportamientos que no esperas, son los correctos. Como indicó xiruko, para que inserte valores por default, deberías omitir esos campos en el insert. En caso contrario, tratará de insertar el valor pasado en la query. Por otro lado, si en la definición del campo indicaste que no permita null y en el insert el valor es null, saltará el error. Debes ser tú, quien controle todo eso por código.

- Nice to see you again -

gAb1

Entonces la solución es o bien usar un ternario al declarar la variable:

Código (php) [Seleccionar]
$checkbox1 = isset($_POST['checkbox1']) && $_POST['checkbox1'] != '' ? filter_input(INPUT_POST, 'checkbox1', FILTER_SANITIZE_STRING) : 0;

O bien usando IFNULL() para todos:

Código (sql) [Seleccionar]
VALUES (IFNULL(?, DEFAULT(0)), IFNULL(?, DEFAULT(0)), IFNULL(?, DEFAULT(0)), IFNULL(?, DEFAULT(0)), IFNULL(?, DEFAULT(0)))

No se cual usar :P