【发布时间】:2012-03-05 10:34:32
【问题描述】:
尝试将 DEFAULT 值插入 MySQL 数据库列
简单的例子
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 不使用日期或日期时间字段
- 它的所有日期都作为 Unix 时间戳存储在 INT 字段中
- 这可能是因为 D7 希望保持日期处理独立于不同数据库如何实现日期时间字段
- 我认为这是允许应用程序处理转换并显示时间戳 int 字段的好习惯
- 将在 UNIX 时间 4294967295 为 02/07/2106 之前提供住宿 格林威治标准时间上午 6 点 28 分。 (int 是无符号的)
要查看允许的类型,您可以在此处查看
- 文件:schema.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()
- 函数 processField()
- 函数:getFieldTypeMap()
如果您传递的不是这些,格式错误的表 sql 将阻止您创建表本身
如果你已经在 mysql 中有包含日期和日期时间字段的数据库字段,那么你可能需要创建一个时间戳字段以使其与 D7 兼容
【问题讨论】: