【问题标题】:Mysql - Stored procedure not running inMysql - 存储过程未运行
【发布时间】:2018-03-24 18:00:52
【问题描述】:

我需要计算数据库中表的确切行数(不使用 INFORMATION_SCHEMA 中的 TABLE_ROWS) 我正在尝试从this post执行脚本

SET @tableSchema = 'Db_Warehouse';
SET SESSION group_concat_max_len = 10000000;
SET @rowCounts = (
  SELECT GROUP_CONCAT(CONCAT('SELECT ''',TABLE_NAME,''', COUNT(*) FROM ', TABLE_NAME) SEPARATOR ' union all ')
  FROM information_schema.tables WHERE table_schema = @tableSchema
);
PREPARE statement FROM @rowCounts;
EXECUTE statement;

但我不断收到错误代码 1064:

<e>Query: PREPARE statement FROM @rowCounts

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table union all SELECT 'COX_ClientSatisfaction', COUNT(*) FROM COX_ClientSatisfa' at line 1

希望你能给点建议。

【问题讨论】:

  • 你有一个表名table吗?您应该修改您的 CONCAT() 以在标识符周围加上反引号。
  • 我也必须评论一下,看起来您只是想获取所有表中的行数。 SHOW TABLE STATUS 不行吗?或者它的等价物SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES... 我知道这些只是表行的估计,但它们通常很接近,并且它的运行速度比每个表上的 COUNT(*) 快很多倍。跨度>
  • 嗨@BillKarwin 谢谢你的建议 - 我确实运行了 SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES... 但我需要这个来确定数据迁移是否成功,因为这是一个估计值两个数据库之间的数字不同
  • 如果您要比较两个数据库,您可能希望使用mysqldbcompare 而不是花时间编写自己的数据库?该工具是免费的,它可以比较表定义、行数甚至数据。还有很多选项可以自定义它的功能。
  • 这似乎正是我所需要的!谢谢@BillKarwin

标签: mysql dynamic prepared-statement


【解决方案1】:

上面cmets的总结:在克隆数据库中检查表行数是否相同的任务最好使用现有工具mysqldbcompare来完成。

过程中错误的原因是MySQL reserved word table 上的语法错误。

在设计自动查询生成器时,最好使用手册中Schema Object Names 下所述的分隔标识符。

例如,这是一种更安全的查询方式:

SELECT GROUP_CONCAT(
  CONCAT(
    'SELECT ', QUOTE(TABLE_NAME), ', COUNT(*) FROM `', TABLE_NAME, '`')
  SEPARATOR ' UNION ALL ')
FROM information_schema.tables WHERE table_schema = @tableSchema

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2016-04-22
    • 2018-03-07
    • 2019-06-25
    相关资源
    最近更新 更多