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

Posted

技术标签:

【中文标题】MySQL - 无法在列中插入 NULL 值,但我指定了默认值?【英文标题】:MySQL - Cannot insert NULL value in column, but I have a default value specified? 【发布时间】:2011-03-24 00:23:35 【问题描述】:

我在 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)

【问题讨论】:

只是我还是只有 12 个字段,而您却尝试插入 15 个值? 【参考方案1】:

改用DEFAULT 关键字:

INSERT INTO users (TimeZoneId) VALUES (DEFAULT);

【讨论】:

谢谢比尔,这行得通,但至于答案,我仍在调查为什么它今天突然出现,而不是之前出现。所以它可能是 NHibernate,或者 MySQL 不确定。 如果行为发生了变化,那么您的环境代码数据中的某些内容一定有所改变.我猜不出是哪一个。否则行为没有改变——它一直都是这样工作的,你从来没有注意到。我有时也会遇到这种情况。 当你硬写查询时,不提该列将使mysql使用默认值。但是,如果你明确提到 null 作为值,它会抛出异常。当您使用按原样(null)插入 bean 值的编程库时会发生这种情况,在这种情况下,为 bean 变量指定默认值即可:String name = "default";【参考方案2】:

不要插入 NULL 值。我假设您正在尝试这种语法:

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

改为使用以下语法:

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

有关详细信息,请参阅MySQL docs on INSERT。

【讨论】:

这可能是它,我现在正在调查,因为它以前工作过,只是开始抱怨 NULL 插入。 当您在多行插入中插入空值时,MySQL 会发出警告而不是失败。也许它之前总是在做多行插入,或者类似的奇怪的事情。【参考方案3】:

您在尝试插入 NULL 的字段上设置了“NOT NULL”。

例如。 国家标识, 文化信息 ID, 时区编号

执行以下操作:

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)

【讨论】:

是的,但是当我允许 null 时,它实际上插入的是 null 而不是默认值。 对不起,应该更好地阅读 q:D。然后应该使用 DEFAULT 关键字,或者将它们完全排除在 INSERT 过程之外。例如。插入users (all_fields_except_nulls) 值 (all_values_except_nulls) 这就是前两个答案所说的。非常感谢,感谢您的帮助。 我们也有同样的问题。两个数据库具有完全相同的架构,字段为updated_at timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL。问题是在一台机器上我们可以插入值(MySQL 本身甚至会自动生成 updated_at 时间戳),但在另一台机器上 MySQL 大喊它不能将 NULL 插入到 updated_at 中。所以我猜,MySQL 在版本之间改变了一些东西。或者,服务器之间可能存在一些不同的设置。或者这个错误可能是错误的:bugs.mysql.com/bug.php?id=72628【参考方案4】:

作为使用 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 的上下文中是如何工作的,但是因为问题的这一部分没有得到很好的解释。

【讨论】:

感谢罗斯科。可以,但是已经有人建议了。 原来如此,没注意到其他答案已更新=)【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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;

就是这样。

【讨论】:

以上是关于MySQL - 无法在列中插入 NULL 值,但我指定了默认值?的主要内容,如果未能解决你的问题,请参考以下文章

插入数据并在列中添加前一行数据

Python QTableView:如何在列中插入项目

如何在代码中的sql表列中插入默认值

在列中插入默认值(访问数据库)

如何使用 Spark 数据框中的 lit 在列中插入值?

在列中查找值,填充'直到非空白单元格