2010-08-02 15 views
35

Ho una tabella in MySQL che ha alcune colonne con valori predefiniti specificati, ma quando provo a inserire una riga, (non specificando i valori per quelle colonne predefinite), genera un errore che dice che non posso inserire valori NULL.MySQL - Impossibile inserire il valore NULL nella colonna, ma ho specificato un valore predefinito?

Ecco l'esempio di tabella;

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`) 
) 

Si lamenta TimeZoneID, e quando io popolo TimeZoneID, si lamenta CultureInforId.

Sto usando MySQL Versione: 5.1.43-comunità

Ecco la query di inserimento che sto cercando di inserire, afferrato da 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

Sono solo io o ci sono solo 12 campi eppure stai provando ad inserire 15 valori? – Ross

risposta

36

Usa la parola chiave DEFAULT invece:

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

+1: Ricordo di recente ... –

+0

Grazie Bill, funziona, ma per quanto riguarda la risposta, sto ancora indagando sul motivo per cui tutto ad un tratto è apparso oggi, e non prima. Quindi potrebbe essere NHibernate, o MySQL non è sicuro. – Ryk

+2

Se il comportamento è cambiato, è necessario aver cambiato qualcosa in * ambiente *, * codice * o * dati *. Non riesco a indovinare quale. Oppure il comportamento non è cambiato - ha funzionato in questo modo e non l'hai mai notato. Mi succede a volte. –

6

Non inserire valori NULL. Sto assumendo che stava tentando la seguente sintassi:

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

Invece, utilizzare la seguente sintassi:

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

Per ulteriori informazioni, vedere la MySQL docs on INSERT.

+0

Questo potrebbe essere, sto indagando ora, poiché questo funzionava prima e ho appena iniziato a lamentarmi degli inserti NULL. – Ryk

+0

Quando si inseriscono valori nulli su un inserto multi-riga, MySQL fornisce un avvertimento invece di fallire. Forse faceva sempre un inserto multi-fila prima, o qualcosa di strano come quello. –

4

Si dispone di "NOT NULL" nei campi in cui si sta tentando di INSERIRE NULL.

es. CountryId, CultureInfoId, TimeZoneID

eseguire il seguente:

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: Non sapevamo che voleva il valore di default invece di NULL su inserto "null". Fondamentalmente, come già è stato suggerito, utilizzare la parola chiave DEFAULT al posto di NULL sui valori.

OPPURE lasciare i campi NULL e valori completamente fuori e mysql utilizzerà i valori predefiniti definiti ad es.

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ì, ma nel momento in cui autorizzo i valori null, in realtà inseriscono valori null e non i valori predefiniti. – Ryk

+0

Ah scusa dovrei leggere il q meglio: D. Deve essere usata la parola chiave DEFAULT OPPURE, oppure si lascia completamente fuori dal processo INSERT. es. INSERISCI IN: 'users' (all_fields_except_nulls) VALUES (all_values_except_nulls) – User123342234

+0

Ecco cosa hanno detto le precedenti 2 risposte. Grazie mille, apprezzo l'aiuto. – Ryk

0

In alternativa utilizzando la parola chiave DEFAULT si può anche semplicemente non specificare i valori per i campi che si desidera avere valori di default. Per esempio, se appena rimossa TimeZoneID, CountryId e CultureInfoId dalla query del tutto quelle colonne riceveranno i valori di default automaticamente:

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) 

Non sono sicuro di come dovrebbe funzionare nel contesto di NHibernate tuttavia come quella parte di la domanda non è stata spiegata abbastanza bene.

+0

Grazie Rosco. Funzionerà sì, ma è già stato suggerito. – Ryk

+0

Così è stato, non ho notato l'altra risposta era stata aggiornata =) – Ross

0

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

Per questi campi è stata impostata vincoli come "Non Null" e, quindi, valori inseriti non può essere nullo e quindi sia alterare la struttura della tabella o semplicemente non specificare i valori per i campi che si desidera avere valori predefiniti.

Problemi correlati