0
试图插入一个默认值到MySQL数据库列
简单的例子的Drupal 7 db_insert和缺省列值
CREATE TABLE test (
id int(11) NOT NULL,
name varchar(10) NOT NULL,
test_date date NOT NULL
) ENGINE=MyISAM;
在MySQL我可以做
INSERT INTO test(id) VALUES(1);
工作正常
现在我转到drupal 7并执行以下操作:
$data = array('id' => 1);
$result = db_insert('test')->fields($data)->execute();
我得到下面的错误
PDOException: SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value: INSERT INTO {test} (id) VALUES (:db_insert_placeholder_0); Array ([:db_insert_placeholder_0] => 1)
上的MySQL中的 “SQL模式” 设置为 ''(空字符串)
问题
- 究竟是什么原因错误发生?是Drupal(或PDO)期望为所有列插入值吗?
- 可以说我想插入一个MySQL DEFAULT值到日期列中,我将如何使用db_insert来做到这一点?
感谢
======================================= =================================在挖掘之后 说明:
- Drupal 7的做不使用日期或日期时间字段
- 它的所有日期都存储在INT字段中作为Unix时间戳
- 这可能是因为D7想要保留日期处理独立的数据库如何不同实现日期时间字段
- 我认为这是一个很好的做法,允许应用程序处理转换和显示时间戳的int字段
- 将happly acomodate截至UNIX时间4294967295是2106年2月7日 上午6点28分。 (整型未签名)
看到允许的类型,您可以点击此处查看
- 文件:架构。INC
功能:getFieldTypeMap()
'varchar:normal' => 'VARCHAR', 'char:normal' => 'CHAR', 'text:tiny' => 'TINYTEXT', 'text:small' => 'TINYTEXT', 'text:medium' => 'MEDIUMTEXT', 'text:big' => 'LONGTEXT', 'text:normal' => 'TEXT', 'serial:tiny' => 'TINYINT', 'serial:small' => 'SMALLINT', 'serial:medium' => 'MEDIUMINT', 'serial:big' => 'BIGINT', 'serial:normal' => 'INT', 'int:tiny' => 'TINYINT', 'int:small' => 'SMALLINT', 'int:medium' => 'MEDIUMINT', 'int:big' => 'BIGINT', 'int:normal' => 'INT', 'float:tiny' => 'FLOAT', 'float:small' => 'FLOAT', 'float:medium' => 'FLOAT', 'float:big' => 'DOUBLE', 'float:normal' => 'FLOAT', 'numeric:normal' => 'DECIMAL', 'blob:big' => 'LONGBLOB', 'blob:normal' => 'BLOB',
其他的功能,你可能有兴趣看(逻辑淌下这样)
- 功能createTableSql()
- 功能createFieldSql()
- function processField()
- 功能:getFieldTypeMap()
如果传递除了这些之外的任何一个畸形表的SQL将创建表本身
阻止你,如果你已经有mysql中的日期和日期时间字段的数据库字段,那么你可能需要创建一个时间戳字段,以使其与D7兼容
SESSION SQL_MODE也设置为“” – naveen 2012-02-19 00:02:51