gpt4 book ai didi

mysql - mysql 在 windows 和 linux 中的不同结果

转载 作者:行者123 更新时间:2023-11-30 22:08:37 26 4
gpt4 key购买 nike

我正在将 mysql 从 linux 迁移到 Windows 机器。我有一个使用映射表的更新查询在 Windows 和 Linux 中给出不同的结果。我提供了重现问题的步骤和我得到的结果。

在 Linux 中按照以下步骤操作:

  1. 创建所需的表

    CREATE TABLE `buildmapping` ( 
    `ver` varchar(36) DEFAULT NULL,
    `build` varchar(36) DEFAULT NULL,
    `branchname` varchar(36) DEFAULT NULL,
    `buildminor` varchar(36) DEFAULT NULL,
    UNIQUE KEY `bmap` (`ver`,`build`,`branchname`,`buildminor`),
    KEY `ak` (`ver`),
    KEY `br` (`branchname`),
    KEY `bi` (`build`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

    CREATE TABLE `s_Last7days` (
    `ver` varchar(36) DEFAULT NULL,
    `build` varchar(36) DEFAULT NULL,
    `branchname` varchar(36) DEFAULT NULL,
    `buildminor` varchar(36) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  2. 插入所需数据

    Insert into buildmapping values ('1522','105','release_01','682');
    Insert into buildmapping values ('1384','105','release_01','682');
    Insert into buildmapping values ('1090','105','release_01','682');
    Insert into s_Last7days values ('0','105','release_01','682');
  3. 使用映射表更新事实

    update s_Last7days b , buildmapping c 
    set b.ver=c.ver
    where b.ver=0
    and b.Build=c.build
    and b.BuildMinor=c.buildminor
    and b.branchname=c.branchname;
  4. 验证数据

    select * from s_Last7days; 
    +------+-------+------------+------------+
    | ver | build | branchname | buildminor |
    +------+-------+------------+------------+
    | 1522 | 105 | release_01 | 682 |
    +------+-------+------------+------------+
  5. 从 Linux 服务器获取转储:

    mysqldump -uxxxxx -pxxxxxx -hxxxxx databasename buildmapping > buildmapping_bk1128.sql 
  6. SSH 文件到 Windows 服务器

在 Windows 服务器中执行以下步骤:

  1. 在 Windows 中恢复表格。 (我用的是 MySQL Workbench)

  2. 创建所需的表

    CREATE TABLE `s_Last7days` ( 
    `ver` varchar(36) DEFAULT NULL,
    `build` varchar(36) DEFAULT NULL,
    `branchname` varchar(36) DEFAULT NULL,
    `buildminor` varchar(36) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  3. 插入所需数据

    Insert into s_Last7days values ('0','105','release_01','682'); 
  4. 使用映射表更新事实

    update s_Last7days b , buildmapping c 
    set b.ver=c.ver
    where b.ver=0
    and b.Build=c.build
    and b.BuildMinor=c.buildminor
    and b.branchname=c.branchname;
  5. 验证数据

    select * from s_Last7days; 
    +------+-------+------------+------------+
    | ver | build | branchname | buildminor |
    +------+-------+------------+------------+
    | 1090 | 105 | release_01 | 682 |
    +------+-------+------------+------------+

我希望两台服务器同步。有人可以帮我解决这个问题吗?

最佳答案

SQL 的一个特点是,未使用 ORDER BY 子句指定的结果集会以不可预测 的顺序返回其行。这有点像说它们以随机顺序返回。但是,麻烦的是,它们通常以与上次相同的顺序返回,直到它们不是。如果这些东西真的是随机的,那么 Linux 上的数据库中的这样的缺陷将是不太可能潜入:有人会检测到它们并修复它们。

在这种情况下,您所说的结果集是。

select c.ver 
from s_Last7days b , buildmapping c
where b.ver=0
and b.Build=c.build
and b.BuildMinor=c.buildminor
and b.branchname=c.branchname;

请注意,它返回三个不同的 ver 值。当您在更新中使用此结果集时,它会更新该行三次,一次针对结果集中的每个值。恰好最后出现的那个是粘住的那个。

您发现您在 Windows 上运行的 MySQL 服务器与在 Linux 上运行的服务器具有不可预测的不同含义。

没有办法强制您的两台服务器具有相同的不可预测含义。这是做不到的。您必须消除查询中的不可预测性,或者忍受不可预测性。此查询获取 ver 的最大值。

select c.ver 
from s_Last7days b , buildmapping c
where b.ver=0
and b.Build=c.build
and b.BuildMinor=c.buildminor
and b.branchname=c.branchname
order by c.ver DESC
limit 1

您的 Linux 数据库有一个错误,导致无法原封不动地移植到 Windows。您很幸运(也可能不幸)直到现在才发现该错误。您必须在移植此数据库时修复此错误,否则将承受此错误的后果。

关于mysql - mysql 在 windows 和 linux 中的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com