【问题标题】:CREATE TABLE does not works to InnoDB, but works to MyISAMCREATE TABLE 不适用于 InnoDB,但适用于 MyISAM
【发布时间】:2017-08-18 16:43:01
【问题描述】:

我有这张桌子:

CREATE TABLE `peso_tec_dt_aj` (
  `idade` int(11) DEFAULT NULL,
  `tecnico` varchar(50) DEFAULT NULL,
  `obt` double DEFAULT NULL,
  `pad` decimal(4,3) DEFAULT NULL,
  `aves_peso` int(11) DEFAULT NULL,
  `data_domingo` datetime DEFAULT NULL,
  `data_domingo_ajustada` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  KEY `peso_tec_dt_aj_idade_tecnico_index` (`idade`,`tecnico`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

如果我将 create 与语句 ENGINE=MYSAM 一起使用,则以下查询有效,但如果我与引擎 InnoDB 一起使用,则无效。

如果我不进行聚合,或者如果我在 group by 中删除列字段 data_domingo (DATETIME),它也可以工作:

CREATE TABLE bucket_15.resultado as (
    select 
    peso_tec_dt_aj.idade,
    peso_tec_dt_aj.tecnico, 
    (
        ROUND(
            SUM(peso_tec_dt_aj.obt * peso_tec_dt_aj.aves_peso) /
            SUM(peso_tec_dt_aj.aves_peso), 3
            )
    ) as campo_computeado
    from bucket_15.peso_tec_dt_aj 
    group by 
    peso_tec_dt_aj.idade,
    peso_tec_dt_aj.tecnico,
    peso_tec_dt_aj.data_domingo
);

运行此查询后,MySQL 不会显示错误。没有create table 的查询运行正常。

但是,上面的查询非常简单。为什么 MySQL 不能用这些列和数据创建表?

MySQL 版本:5.7

这里有一些屏幕截图显示,使用相同的查询,如果引擎不是 MISAM,则没有结果。

FIRST IMAGE:使用以下两个引擎运行我将在 CREATE WITH SELECT 语句中使用的查询:MYISAM 和 InnoDB。

第二个图像:在没有 ENGINE=MYISAM 的情况下运行查询。上面的结果预计会在新表resultado上,但不是:没有错误。

第三张图片:使用 ENGINE=MYISAM - 表 resultado 是神奇地创建的

【问题讨论】:

  • 我对此进行了测试,使用 InnoDB 可以正常工作。请将确切的错误消息复制并粘贴到您上面的问题中。当您在 Stack Overflow 上询问有关错误的问题时,请始终包含错误消息的确切文本。
  • 在下面的脚本中,一切都按预期工作db-fiddle。
  • Errors != No errors。你能从 MySQL 命令行执行CREATE TABLE 吗?。
  • 为什么你把引擎放在开头而不像往常一样放在结尾?
  • @wchiquito - 当我在命令行运行时,mysql 显示错误:ERROR 1365 (22012): Division by 0。奇怪的是,如果我使用相同的查询,我得到的结果没有上述错误,但如果我使用 CREATE 和 SELECT,错误是由 MySql 呈现的。更奇怪的是,如果ENGINE为MYISAM,则不会出现Mysql描述的错误,建表正常。

标签: mysql innodb myisam


【解决方案1】:

这个创建表在我的 5.6.35 版本下工作正常,没有任何错误

CREATE TABLE `peso_tec_dt_aj` (
  `idade` int(11) DEFAULT NULL,
  `tecnico` varchar(50) DEFAULT NULL,
  `obt` double DEFAULT NULL,
  `pad` decimal(4,3) DEFAULT NULL,
  `aves_peso` int(11) DEFAULT NULL,
  `data_domingo` datetime DEFAULT NULL,
  `data_domingo_ajustada` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  KEY `peso_tec_dt_aj_idade_tecnico_index` (`idade`,`tecnico`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1;

CREATE TABLE resultado as (
    select 
    peso_tec_dt_aj.idade,
    peso_tec_dt_aj.tecnico, 
    (
        ROUND(
            SUM(peso_tec_dt_aj.obt * peso_tec_dt_aj.aves_peso) /
            SUM(peso_tec_dt_aj.aves_peso), 3
            )
    ) as campo_computeado
    from bucket_15.peso_tec_dt_aj 
    group by 
    peso_tec_dt_aj.idade,
    peso_tec_dt_aj.tecnico,
    peso_tec_dt_aj.data_domingo
) ENGINE=MYISAM DEFAULT CHARSET=latin1;

关于第二个查询,如果它不起作用,MySQL 应该将错误记录到终端或日志文件中。

在您的第二个创建查询中,您的名称中有点。这就是它不起作用的原因。

【讨论】:

  • Bucket_15.resultado 应该不是问题。它将在模式或数据库bucket_15 中创建表resultado。
  • @wchiquito - resultado 未创建。最终的结果不是预期的!
  • 你能解释一下你的期望吗@calebeaires
  • @Noob - 我编辑了问题并放了截图以更好地理解问题。谢谢你的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多