2010-08-02 15 views
35

Tengo una tabla en MySQL que tiene algunas columnas que tienen valores predeterminados especificados, pero cuando trato de insertar una fila, (no especificando valores para esas columnas predeterminadas), arroja un error que dice que no puedo insertar valores NULL.MySQL - No se puede insertar el valor NULL en la columna, pero tengo un valor predeterminado especificado?

Aquí está el ejemplo de la tabla;

CREATE TABLE `users` (
    `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `UniqueName` varchar(120) NOT NULL, 
    `Password` varchar(1000) NOT NULL, 
    `PublicFlag` tinyint(1) NOT NULL, 
    `NoTimesLoggedIn` int(10) unsigned NOT NULL DEFAULT '0', 
    `DateTimeLastLogin` timestamp NOT NULL DEFAULT '1971-01-01 00:00:00', 
    `UserStatusTypeId` int(10) unsigned NOT NULL, 
    `Private` tinyint(1) NOT NULL DEFAULT '0', 
    `SiteName` varchar(255) NOT NULL, 
    `CountryId` int(10) NOT NULL DEFAULT '0', 
    `TimeZoneId` varchar(255) NOT NULL DEFAULT 'UTC', 
    `CultureInfoId` int(10) unsigned NOT NULL DEFAULT '0', 
    `DateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `UserCreated` int(10) unsigned NOT NULL, 
    `LastUpdatedBy` int(10) unsigned NOT NULL, 
    `DateLastUpdated` datetime DEFAULT NULL, 
    PRIMARY KEY (`Id`), 
    UNIQUE KEY `UniqueName_UNIQUE` (`UniqueName`), 
    KEY `Index 3` (`SiteName`) 
) 

Se queja de TimeZoneID, y cuando lo pueblan TimeZoneID, se queja del CultureInforId.

estoy usando MySQL Versión: 5.1.43-comunidad

Ésta es la consulta de inserción que estoy tratando de insertar, agarrado de NHibernate Profiler:

INSERT INTO Users 
      (UniqueName, 
      Password, 
      PublicFlag, 
      NoTimesLoggedIn, 
      DateTimeLastLogin, 
      SiteName, 
      TimeZoneId, 
      DateCreated, 
      DateLastUpdated, 
      Private, 
      CountryId, 
      CultureInfoId, 
      UserCreated, 
      LastUpdatedBy, 
      UserStatusTypeId) 
VALUES  ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1, 
0,'1/01/1971 12:00:00 AM','V9O1T80Q6D',NULL,'2/08/2010 2:13:44 AM', 
'2/08/2010 2:13:44 AM',0, NULL, NULL, 4, 4,31) 
+0

¿Soy yo o solo hay 12 campos y aún estás tratando de insertar 15 valores? – Ross

Respuesta

36

Usar la palabra clave DEFAULT lugar:

INSERT INTO users (TimeZoneId) VALUES (DEFAULT); 
+0

+1: Recuerdo que esto viene recientemente ... –

+0

Gracias Bill, esto funciona, pero en cuanto a la respuesta, todavía estoy investigando por qué apareció de repente hoy, y no antes. ASÍ podría ser NHibernate, o MySQL no está seguro. – Ryk

+2

Si el comportamiento cambió, entonces debe haber cambiado algo en su * entorno *, su * código * o sus * datos *. No puedo adivinar cuál. O bien, el comportamiento no cambió; funcionó de esta manera todo el tiempo y nunca lo habías notado. Eso me pasa a veces. –

6

No inserte valores NULL. Estoy asumiendo que estaban tratando esta sintaxis:

INSERT INTO users VALUES (null, 'Jones', 'yarg', 1, null, null, null); 

su lugar, utilice la siguiente sintaxis:

INSERT INTO users SET UniqueName='Jones', Password='yarg'; 

Para obtener más información, ver la MySQL docs on INSERT.

+0

Esto podría ser, estoy investigando ahora, ya que esto estaba funcionando antes y comencé a quejarme de las inserciones NULL. – Ryk

+0

Cuando inserta valores nulos en una inserción de varias filas, MySQL da una advertencia en lugar de fallar. Tal vez siempre estaba haciendo una inserción de varias filas antes, o algo así. –

4

Tiene "NOT NULL" establecido en los campos en los que intenta INSERT NULL.

por ejemplo. CountryId, CultureInfoId, TimeZoneID

ejecutar lo siguiente:

ALTER TABLE `users` MODIFY `CountryId` int(10) DEFAULT '0' NULL; 
ALTER TABLE `users` MODIFY `CultureInfoId` int(10) unsigned DEFAULT '0' NULL; 
ALTER TABLE `users` MODIFY `TimeZoneId` varchar(255) DEFAULT 'UTC' NULL; 

EDIT: No me di cuenta que quería que el valor por defecto en lugar de NULL en caso de inserción "nulo". Básicamente, como ya se ha sugerido, use la palabra clave DEFAULT en lugar de NULL en los valores.

O deje los campos y valores NULOS por completo y mysql utilizará los valores predeterminados definidos, por ejemplo.

INSERT INTO Users 
     (UniqueName, 
     Password, 
     PublicFlag, 
     NoTimesLoggedIn, 
     DateTimeLastLogin, 
     SiteName, 
     DateCreated, 
     DateLastUpdated, 
     Private, 
     UserCreated, 
     LastUpdatedBy, 
     UserStatusTypeId) 
VALUES  ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1, 
0,'1/01/1971 12:00:00 AM','V9O1T80Q6D','2/08/2010 2:13:44 AM', 
'2/08/2010 2:13:44 AM',0, 4, 4,31) 
+0

Sí, pero en el momento en que lo dejo nulo, en realidad inserta nulos y no los valores predeterminados. – Ryk

+0

Ah, perdón debería leer la q mejor: D. La palabra clave DEFAULT debe usarse entonces O los deja fuera del proceso INSERT por completo. por ej. INSERT INTO 'users' (all_fields_except_nulls) VALUES (all_values_except_nulls) – User123342234

+0

Eso es lo que dijeron las 2 respuestas anteriores. Muchas gracias, aprecia la ayuda. – Ryk

0

Como alternativa al uso de la palabra clave DEFAULT también puede simplemente no especificar los valores de los campos que desea tener valores predeterminados. Por ejemplo, si se acaba de quitar TimeZoneID, CountryId y CultureInfoId de la consulta plenamente dichas columnas recibirán automáticamente los valores por defecto:

INSERT INTO Users 
    (UniqueName, 
    Password, 
    PublicFlag, 
    NoTimesLoggedIn, 
    DateTimeLastLogin, 
    SiteName, 
    DateCreated, 
    DateLastUpdated, 
    Private, 
    UserCreated, 
    LastUpdatedBy, 
    UserStatusTypeId) 
VALUES 
    ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1,0, 
    '1/01/1971 12:00:00 AM','V9O1T80Q6D','2/08/2010 2:13:44 AM', 
    '2/08/2010 2:13:44 AM',0,4,4,31) 

No estoy seguro de cómo funcionaría en el contexto de NHibernate sin embargo, como esa parte de la pregunta no fue tan bien explicada.

+0

Gracias Rosco. Eso funcionará sí, pero ya se ha sugerido. – Ryk

+0

Así fue, no notó que la otra respuesta se había actualizado =) – Ross

0

TimeZoneID varchar(255) NOT NULL DEFAULT 'UTC', CultureInfoId` int (10) NOT NULL DEFAULT sin signo '0',

Por esta campos que ha establecido restricciones como "no nulo" y por lo tanto los valores insertado no puede ser nulo y por lo tanto tampoco alterar la estructura de tabla o simplemente no especifica valores para los campos que desea que tengan valores predeterminados.

Cuestiones relacionadas