3

我必须在模型中运行这个 sql 例程:

$this->db->query('LOCK TABLE orders WRITE');
$this->db->query('TRUNCATE TABLE orders');
$this->db->query('INSERT INTO orders SELECT * FROM orders_tmp');
$this->db->query('UNLOCK TABLES');

但我收到此错误:

错误号:1192
无法执行请求的命令:表处于锁定状态或事务运行
TRUNCATE TABLE 命令

我在这张桌子上使用 MyISAM 作为数据库引擎。

请你帮助我好吗?

4

3 回答 3

1

尝试这个

$this->db->query('TRUNCATE TABLE orders');
$this->db->query('LOCK TABLE orders WRITE');
$this->db->query('INSERT INTO orders SELECT * FROM orders_tmp');
$this->db->query('UNLOCK TABLES');
于 2015-04-10T20:26:33.810 回答
1

要在无法进行并发插入时对表 real_table 执行许多 INSERT 和 SELECT 操作,您可以将行插入到临时表 temp_table 中,并使用临时表中的行定期更新实际表。这可以通过以下代码完成:

mysql> LOCK TABLES real_table WRITE, temp_table WRITE;

请询问它是否不适合您。

于 2012-07-18T12:19:47.527 回答
1

您需要为查询中的所有表获取锁,而不仅仅是您正在写入的表。因此,在您的情况下,您还需要对orders_tmp.

从文档:

需要锁的会话必须在单个 LOCK TABLES 语句中获取它需要的所有锁。在持有如此获得的锁时,会话只能访问锁定的表

此处的文档:https ://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

干杯

于 2015-12-28T22:11:51.307 回答