2012-02-14 72 views
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模式” 设置为 ''(空字符串)

问题

  1. 究竟是什么原因错误发生?是Drupal(或PDO)期望为所有列插入值吗?
  2. 可以说我想插入一个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兼容

回答

0

这是可能的,而不是全局设置SQL模式,而是在用户会话设置,尝试获取此信息,执行这个查询 -

SELECT @@SESSION.SQL_MODE; 
+0

SESSION SQL_MODE也设置为“” – naveen 2012-02-19 00:02:51