【问题标题】:Drupal 7 db_insert and DEFAULT column valuesDrupal 7 db_insert 和 DEFAULT 列值
【发布时间】: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模式”设置为''(空字符串)

问题

  1. 发生此错误的原因是什么? drupal(或 PDO)是否期望为所有列插入值?
  2. 假设我想在日期列中插入一个 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 兼容

【问题讨论】:

    标签: mysql pdo drupal-7


    【解决方案1】:

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

    SELECT @@SESSION.SQL_MODE;
    

    【讨论】:

    • SESSION SQL_MODE 也设置为 ""
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多