mysql 非 native ,仅当表存在时才选择

标签 mysql perl

这类问题已经发过几次了,但是在下面的情况下提供的解决方案并不理想。在第一个查询中,我选择了在执行第一个查询时我知道存在的表名。然后在遍历它们时,我想查询所选表中的记录数,但前提是它们仍然存在。问题是,在循环期间,一些表被另一个脚本删除。例如:

SELECT tablename FROM table
-- returns say 100 tables

while (%tables){
    SELECT COUNT(*) FROM $table
    -- by the time it gets to the umpteenth table, it's been dropped
    -- so the SELECT COUNT(*) fails
}

而且,我猜因为它是由 cron 运行的,所以它会致命地失败,我收到一封来自 cron 的电子邮件,说明它失败了。

DBD::mysql::st execute failed: Table 'xxx' doesn't exist at /usr/local/lib/perl/5.10.1/Mysql.pm line 175.

脚本正在使用已弃用的 Mysql.pm perl 模块。

最佳答案

显然,您需要保护表以确保在执行查询之前它不会被删除。请记住,如果您从某种表锁开始,以避免可能的删除 - 从其他地方发出的 DROP TABLE 查询将因某些锁错误而失败,或者至少会等到您的 SELECT 完成。删除表并不是真正经常使用的操作,因此在大多数情况下,模式设计在服务器操作期间仍然存在——您观察到的是非常罕见的行为。一般来说,不支持在其他查询期间防止表被删除,但是,在下面文档的评论中,您可能会发现一些使用信号量表来实现它的技巧。

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

“表锁仅防止其他 session 进行不适当的读取或写入。持有锁的 session ,即使是读锁,也可以执行表级操作,例如 DROP TABLE。截断操作不是事务安全的,因此如果 session 在事件事务期间或持有表锁时尝试一个,则会发生错误。”

“如果您需要对读锁或写锁通常不支持的表做一些事情(比如删除或截断表),并且您能够合作,您可以试试这个:使用一个信号量表,并创建两个每个进程的 session 数。在第一个 session 中,根据需要在信号量表上获取读或写锁。在第二个 session 中,对所有其他表执行您需要执行的所有操作。”

关于mysql 非 native ,仅当表存在时才选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908907/

相关文章:

java - 如何使用 LEFT JOIN 创建 JPA NamedQuery

Perl:将 MP3 ID3-Tags 的封面保存到外部 JPG 文件中

php - 如何在codeigniter中减去时间和日期?

php - 等时间间隔后从数据库中获取数据

perl - 带有共享符号的安全隔间会导致 Perl 调试器发出嘶嘶声

perl - 比较两个混合类型的哈希值

regex - 将多个正则表达式匹配项之一分配给变量作为 Perl 单行代码(取消引用数组?)

mysql - Perl 将空时间戳打印到 csv 文件

php - MySQL group concat used with 2 join table 查询结果重复

java - 正则表达式:完全匹配由定界符分割的字符串