MYSQL根据上次更新从表中选择所有行

时间:2012-07-10 16:16:44

标签: mysql

我在远程服务器上有一个大表,并希望在本地计算机上保存一个平面磁盘文件中的副本。如果我保留从表的第一行本地读取的序列号的记录,那么如果行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&lt;&gt;'my update number',1,0)FROM 1_makes WHERE id = 0)

这很有用,只是想问一下IF中的数字1,0是什么意思(make&lt;&gt;'我的更新号码',1,0)

1 个答案:

答案 0 :(得分:1)

通过发出单独的查询可能会更好地服务于您的案例。应用程序首先查询id = 0的行的值,然后根据该值继续。

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

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

或INNER JOIN:

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,表示false,或1,表示true。

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

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

此外,这不包括更新。只有,插入。

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