【问题标题】:MySQL insert query with missing not null fieldsMySQL插入查询缺少非空字段
【发布时间】:2011-06-09 00:17:35
【问题描述】:

我目前正在尝试为 CodeIgniter 使用对象关系映射器,但我遇到了一些我没有预料到的事情。

我有一个包含几个字段的表,其中一些不是 NULL。生成一个缺少 NOT NULL 字段的插入查询——添加了一个新行,但这些字段为空白。

我不知道 MySQL 会忽略查询中不存在的 NOT NULL 字段并插入行。有办法限制吗?

-编辑-

让我添加更多细节并尝试解释一下

这是一个示例表:

CREATE TABLE `test` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `color` varchar(40) COLLATE utf8_bin DEFAULT '',
 `shape` varchar(40) COLLATE utf8_bin NOT NULL,
 `size` varchar(40) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

这是一个示例查询:

INSERT INTO `test` (`shape`) VALUES ('foo')

我的查询中没有 size,但它仍然添加了行 - 这是预期的吗?

(示例查询在 phpMyAdmin 中运行)

【问题讨论】:

  • 请编辑您的问题以包含来自SHOW CREATE TABLE (table_name)的输出
  • 写入的是 NULL 还是空字符串?空字符串将通过 NOT NULL 约束。
  • NOT NULL 确保存储的值永远不会是NULL,但字符串“NULL”不是一回事。 NULL 只是一个占位符,表示缺少任何值...
  • @AJ @Thomas @OMGPonnies 我已经编辑了我的问题。如果您希望我澄清任何事情,请告诉我。谢谢
  • @RS7:当我在 MySQL 5.1.49 上测试时,您在Error 1364: Field "size" doesn't have a default value 中发布的结果表和插入。这个错误是我对几乎任何数据库的期望......

标签: mysql sql codeigniter insert


【解决方案1】:

鉴于问题的测试 INSERT 语句,我认为接受的答案不正确。在我看来,此表或数据库的 MySQL 的“严格模式”已关闭。来自the docs

严格模式控制 MySQL 如何处理无效或丢失的输入值...当要插入的新行不包含非 NULL 列的值时,值丢失其定义中没有明确的 DEFAULT 子句...

如果您未使用严格模式(即,STRICT_TRANS_TABLES 和 STRICT_ALL_TABLES 均未启用),MySQL 会为无效或缺失值插入调整值并产生警告。

您可以通过这些查询了解您的数据库是如何运行的:

SELECT @@global.sql_mode;
SELECT @@session.sql_mode;

此处讨论更改这些值:https://stackoverflow.com/a/5273824/27846

【讨论】:

    【解决方案2】:

    空字符串与NULL 不同。也许 ORM 只为这些字段插入 ''

    【讨论】:

    • 如果我在插入查询中没有为该字段传递任何内容,这会导致该字段为空字符串还是 NULL?
    【解决方案3】:

    不是 codeigniter 开发人员,但我会冒险猜测问题是您的 ORM 正在将空白值传递给数据库,我会检查您的日志以验证这一点,如果是这样,请检查您的 ORM 是否有一些验证选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多