MySQL插入缺少非空字段的查询

时间:2011-06-09 00:17:35

标签: mysql sql codeigniter insert

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

我有一个包含几个字段的表,其中一些字段为NOT 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中运行)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

鉴于问题的测试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 :(得分:1)

不是codeigniter dev,但我猜测问题是你的ORM将空白值传递给数据库,我会检查你的日志来验证这个,如果是这样的话,检查你的ORM是否有一些验证选项。