2010-08-02 62 views
35

我在MySQL有一個表有幾列有指定的默認值,但當我嘗試插入一行,(不指定這些默認列的值),它會引發錯誤,說我不能插入NULL值。MySQL - 不能在列中插入NULL值,但我有指定的默認值?

以下是表格示例;

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

它抱怨TimeZoneId,當我填充TimeZoneId時,它抱怨CultureInforId。

我使用的MySQL版本:43年1月5日,社區

這裏被插入查詢我試圖插入,從NHibernate的探查抓起:

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

它只是我還是隻有12個字段,但你試圖插入15個值? – Ross 2010-08-02 03:06:28

回答

36

使用DEFAULT關鍵字來代替:

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

+1:我記得最近這個... – 2010-08-02 02:56:33

+0

謝謝比爾,這個工作,但至於答案,我仍在調查爲什麼突然出現今天,而不是之前。所以它可能是NHibernate,或MySQL不確定。 – Ryk 2010-08-02 03:59:15

+2

如果行爲發生了變化,那麼您必須在*環境*,*代碼*或*數據*中更改了某些內容。我無法猜出哪一個。否則,這種行爲並沒有改變 - 它一直以這種方式工作,你從未注意到。有時我會發生這種情況。 – 2010-08-10 15:53:56

6

請勿插入NULL值。我假設你正在嘗試這樣的語法:

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

相反,使用此語法:

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

欲瞭解更多信息,請參閱MySQL docs on INSERT

+0

這可能是,我現在正在調查,因爲這是工作之前,剛開始抱怨NULL插入。 – Ryk 2010-08-02 03:39:01

+0

當您在多行插入中插入空值時,MySQL會發出警告而不是失敗。也許它總是在做一個多行插入之前,或者像這樣奇怪的東西。 – 2010-08-02 04:19:38

4

您對您試圖插入NULL的字段設置了「NOT NULL」。

例如。 CountryId, CultureInfoId, TimeZoneId

執行以下命令:

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; 

編輯:沒有意識到他想要的默認值,而不是在 「空」 插入空。基本上已經建議使用DEFAULT關鍵字代替NULL值。

或者將NULL字段和值全部保留,mysql將使用定義的默認值,例如。

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

是的,但是當我允許null的時候,它實際上插入了空值而不是默認值。 – Ryk 2010-08-02 03:50:53

+0

對不起,應該更好地閱讀q:D。應該使用DEFAULT關鍵字,或者將它們全部從INSERT過程中刪除。 例如。 INSERT INTO'users'(all_fields_except_nulls)VALUES(all_values_except_nulls) – User123342234 2010-08-02 03:53:44

+0

這就是前面2個答案所說的。非常感謝,感謝幫助。 – Ryk 2010-08-02 03:56:18

0

作爲使用DEFAULT關鍵字的替代方法,您也可以不指定具有默認值的字段的值。舉例來說,如果你只是刪除TimeZoneId,CountryId和CultureInfoId從查詢完全那些列將自動獲得默認值:

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) 

我不知道怎麼會在NHibernate的背景下工作,但由於該部分這個問題還沒有得到很好的解釋。

+0

謝謝羅斯科。這是可行的,但已經提出。 – Ryk 2010-08-02 04:05:51

+0

所以,沒有注意到其他答案已經更新=) – Ross 2010-08-02 04:21:53

0

TimeZoneId varchar(255) NOT NULL DEFAULT 'UTC', CultureInfoId` INT(10)無符號NOT NULL DEFAULT '0',

對於本領域已設置的限制爲 「非空」,並因此插入值不能爲空,因此任一更改表結構或只是沒有指定你想要有默認值的字段的值。