2011-06-09 92 views
0

我目前正在尝试使用CodeIgniter的对象关系映射器,我遇到了一些我没想到的事情。MySQL插入与缺少不空字段的查询

我有一个表有几个字段,其中一些不是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

请编辑您的问题,包括从'SHOW CREATE TABLE输出(table_name)' – 2011-06-09 00:19:08

+0

是NULL写入还是空字符串?一个空字符串将通过NOT NULL约束。 – Thomas 2011-06-09 00:22:14

+0

“NOT NULL”确保存储的值永远不会是NULL,但字符串“NULL”不是同一个东西。 'NULL'只是一个占位符,表示缺少任何值... – 2011-06-09 00:36:52

回答

3

空字符串是不一样的东西NULL。也许ORM只为这些字段插入''

+0

如果我没有在插入查询中传递该字段的任何内容,那么会导致该字段为空字符串还是NULL? – RS7 2011-06-09 01:06:51

+0

当然不 - 你必须在这种情况下得到错误。 – zerkms 2011-06-09 01:11:22

1

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

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