1

我在远程服务器上有一张大表,想在本地机器上的平面磁盘文件中保留一份副本。如果我保留从表的第一行本地读取的序列号的记录,那么如果行 id=0 <> 我本地存储的列的内容,我可以发出 SELECT 命令以返回表中的所有行序列号?

就像是

SELECT * FROM 1_makes WHERE IF id@0<> local_serial

希望这是有道理的

delimiter $$

CREATE TABLE `1_makes` (
  `id` int(11) NOT NULL,
  `make` varchar(20) DEFAULT NULL,
  `allow_global_disc` tinyint(4) DEFAULT NULL,
  `home_text` text,
  `pack_home_text` text,
  `update_ref` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

所以我想要的是只有当 id=0 和 update_ref 的行的内容与本地存储的值不同时才返回整个表。

如果我得到结果,那么我知道数据已更改,因此我可以将其保存到本地磁盘文件并更新读取的 update_ref

看起来这就是我需要的

我已删除列 update_ref 并将更新值放入 make 列 @ id=0

SELECT * FROM 1_makes WHERE (SELECT IF(make <> 'my update number', 1, 0) FROM 1_makes WHERE id = 0)

这行得通,只是想问一下 IF(make <> 'my update number', 1, 0) 中的数字 1, 0 与什么相关

4

1 回答 1

1

通过发出单独的查询,您的情况可能会更好。应用程序将首先查询 id=0 的行的值,然后根据该值继续。

但是,您可以使用子查询来完成此操作:

SELECT *
FROM 1_make
WHERE (SELECT IF(update_ref <> :my_number, 1, 0) FROM 1_make WHERE id = 0)

或内部联接:

SELECT t1.*
FROM 1_make t1
INNER JOIN 1_make t2
  ON t2.id = 0 AND t2.update_ref <> :my_number

但是,如果您只是测试是否有结果,最好只返回计数而不是返回未使用的值:

SELECT COUNT(*)
FROM 1_make
WHERE (SELECT IF(update_ref <> :my_number, 1, 0) FROM 1_make WHERE id = 0)

或者甚至更好,使用 LIMIT 在第一行之后停止:

SELECT id
FROM 1_make
WHERE (SELECT IF(update_ref <> :my_number, 1, 0) FROM 1_make WHERE id = 0)
LIMIT 1

甚至更好,只需使用 IF 的返回值:

SELECT IF(update_ref <> :my_number, 1, 0)
FROM 1_make
WHERE id = 0

更好的是,为什么要为每一行存储一个 update_ref 的值?为什么不把它移到自己的桌子上:

SELECT IF(update_ref <> :my_number, 1, 0)
FROM my_settings

IF 语句返回 0 表示假,或 1 表示真。

最后,如果 id 是一个增量值,为什么不直接搜索 id 大于存储的最后一个值的行呢:

SELECT id
FROM 1_make
WHERE id > :my_number
LIMIT 1

此外,这不考虑更新。只有,插入。

考虑添加从主服务器复制的从服务器。然后,简单地自动备份从服务器。这是大多数备份的完成方式。

于 2012-07-10T16:42:38.103 回答