【问题标题】:InnoDB insert fails silently, works fine when table is MyISAMInnoDB 插入失败,当表是 MyISAM 时工作正常
【发布时间】:2011-05-24 17:42:06
【问题描述】:

我在 MySQL 5.0.77 中有一个 InnoDB 表,如下所示:

CREATE TABLE `products_vendors` (
`vendor_id` int(10) unsigned NOT NULL,
`product_id` int(10) unsigned NOT NULL,
`original_quantity` smallint(6) unsigned NOT NULL,
`quantity` smallint(5) unsigned NOT NULL,
`price` decimal(19,8) NOT NULL,
`created` int(10) unsigned NOT NULL,
`valid_until` int(10) unsigned NOT NULL,
PRIMARY KEY  (`vendor_id`,`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我正在使用 PHP 和 PDO 来执行插入操作。执行代码时,插入会静默失败。但是,如果我将表从 InnoDB 更改为 MyISAM,一切正常。如果我通过 PHPMyAdmin 运行 InnoDB 插入,则它可以工作。

我已将我的问题归结为这段代码(我的数据库凭据是正确的,因为 MyISAM 工作正常):

$insert_sql = "insert into products_vendors (";
$insert_sql.= "`vendor_id`,";
$insert_sql.= "`product_id`,";
$insert_sql.= "`original_quantity`,";
$insert_sql.= "`quantity`,";
$insert_sql.= "`price`,";
$insert_sql.= "`created`,";
$insert_sql.= "`valid_until` ";
$insert_sql.= ") values (";
$insert_sql.= "'1', '2', '3', '4', '5', '6', '7');";

$db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD, array(PDO::ATTR_PERSISTENT, true));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$st = $db->prepare($insert_sql);
$st->execute();

什么会导致这段代码在 MyISAM 上运行良好,但在 InnoDB 上却静默失败?

非常感谢您的指导。

【问题讨论】:

  • 在innodb上查询后你的mysql日志文件说了什么?
  • 引用整数使它们成为字符串,这是无用的,因为它们将被转换回整数以适应列的类型。
  • 对 InnoDB 表运行插入时,二进制日志不记录任何内容。当表是 MyISAM 时,它记录插入。

标签: php mysql pdo innodb myisam


【解决方案1】:

2 个想法:

  • 您忘记提交事务。
  • 您的持久连接处于未确定状态

【讨论】:

  • 尽管我之前没有活动事务,但将命令包装在 beginTransaction() 和 commit() 中使其工作。也很好奇,我重写了代码以使用 MySQLi,并且在 InnoDB 上一切正常。最后很好奇,这段代码在我的旧主机上运行良好,但在我现在的主机上运行良好。
  • 好的!因此,您的一些主机/服务器/数据库适配器已将自动提交配置为 ON,其他配置为 OFF。不过,我不知道该设置在哪里。通常,我在执行数据修改的第一个查询时发出 BEGIN,在操作结束时发出 COMMIT,并在 register_shutdown_function 中自动回滚,以防出现问题。
  • 我找到了设置。它是打开 PDO 连接时设置的属性。 $db->setAttribute(PDO::ATTR_AUTOCOMMIT, true);当它被明确设置时,我不再需要伪造交易,一切都按原样工作。感谢您的帮助。
猜你喜欢
  • 2011-10-17
  • 2011-11-05
  • 1970-01-01
  • 2011-12-23
  • 2014-01-30
  • 1970-01-01
  • 2011-10-28
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多