我在远程服务器上有一个大表,并希望在本地计算机上保存一个平面磁盘文件中的副本。如果我保留从表的第一行本地读取的序列号的记录,那么如果行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)
答案 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
此外,这不包括更新。只有,插入。
考虑添加从主服务器复制的从属服务器。然后,只需自动备份从属服务器。这就是大多数备份的完成方式。