我目前正在尝试为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中运行)
答案 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;
答案 2 :(得分:1)
不是codeigniter dev,但我猜测问题是你的ORM将空白值传递给数据库,我会检查你的日志来验证这个,如果是这样的话,检查你的ORM是否有一些验证选项。