Drupal 7 db_insert和DEFAULT列值

时间:2012-02-14 01:16:44

标签: mysql pdo drupal-7

尝试将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模式”设置为''(空字符串)

问题

  1. 发生此错误的原因是什么?是drupal(或PDO)期望所有列的插入值?
  2. 假设我想在日期列中插入MySQL DEFAULT值,我将如何使用db_insert?
  3. 由于

    =============================================== ========================= 挖掘后的解释:

    • drupal 7不使用日期或日期时间字段
    • 其所有日期都存储在INT字段中作为Unix时间戳
    • 这可能是因为D7想要保持日期处理,而不依赖于不同数据库如何实现日期时间字段
    • 我认为这是一个很好的做法,允许应用程序处理转换并显示时间戳int字段
    • 将很高兴地直到UNIX时间4294967295是02/07/2106 格林威治标准时间上午6:28。 (int是无符号的)

    查看允许的类型,您可以在此处查看

    • file:schema.inc
    • function: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',
      

    您可能有兴趣看的其他功能(逻辑涓涓细流)

    • function createTableSql()
    • function createFieldSql()
    • function processField()
    • function:getFieldTypeMap()

    如果您传递除此之外的任何内容,格式错误的表sql将阻止您创建表本身

    如果你已经在mysql中拥有包含日期​​和日期时间字段的数据库字段,那么你可能需要创建一个时间戳字段以使其与D7兼容

1 个答案:

答案 0 :(得分:0)

有可能SQL MODE没有全局设置,而是在用户会话中设置,尝试获取此信息,执行此查询 -

SELECT @@SESSION.SQL_MODE;