MySQL - 无法在列中插入NULL值,但我指定了默认值?

时间:2010-08-02 02:36:32

标签: mysql

我在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版本:5.1.43-community

这是我试图插入的插入查询,从NHibernate Profiler抓取:

INSERT INTO Users
           (UniqueName,
            Password,
            PublicFlag,
            NoTimesLoggedIn,
            DateTimeLastLogin,
            SiteName,
            TimeZoneId,
            DateCreated,
            DateLastUpdated,
            Private,
            CountryId,
            CultureInfoId,
            UserCreated,
            LastUpdatedBy,
            UserStatusTypeId)
VALUES     ('zma@zm.com','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)

6 个答案:

答案 0 :(得分:37)

请改为使用DEFAULT关键字:

INSERT INTO users (TimeZoneId) VALUES (DEFAULT);

答案 1 :(得分: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

答案 2 :(得分:5)

在尝试INSERT 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;

编辑:没有意识到他想要“null”插入时的默认值而不是NULL。基本上已经建议使用DEFAULT关键字代替值上的NULL。

或者完全保留NULL字段和值,mysql将使用定义的默认值,例如。

INSERT INTO Users
       (UniqueName,
        Password,
        PublicFlag,
        NoTimesLoggedIn,
        DateTimeLastLogin,
        SiteName,
        DateCreated,
        DateLastUpdated,
        Private,
        UserCreated,
        LastUpdatedBy,
        UserStatusTypeId)
VALUES     ('zma@zm.com','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)

答案 3 :(得分:0)

作为使用DEFAULT关键字的替代方法,您也可以不指定要使用默认值的字段的值。例如,如果您刚刚从查询中删除了TimeZoneId,CountryId和CultureInfoId,则这些列将自动接收默认值:

INSERT INTO Users
    (UniqueName,
    Password,
    PublicFlag,
    NoTimesLoggedIn,
    DateTimeLastLogin,
    SiteName,
    DateCreated,
    DateLastUpdated,
    Private,
    UserCreated,
    LastUpdatedBy,
    UserStatusTypeId)
VALUES
    ('zma@zm.com','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的上下文中这是如何工作的,但问题的那部分并没有得到很好的解释。

答案 4 :(得分:0)

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

对于此字段,您已将约束设置为“非空”,因此插入的值不能为空,因此要么更改表结构,要么不指定要使用默认值的字段的值。

答案 5 :(得分:0)

documentation 表示从 5.6 版开始,您需要默认访问字段。

我已阅读this post about this trouble 我已经解决了这个问题:

mysql> show global variables like 'explicit_defaults_for_timestamp';

如果您的字段的 ON 值更改为 OFF

mysql> set global explicit_defaults_for_timestamp=0;

仅此而已。