我一直在寻找与您相同的东西,但得出的结论是,我正在寻找一种在视图中唯一且稳定地识别记录的方法。
我的用例是一个“银行操作”视图,其中涉及将“存款”表中的记录与“取款”表中的记录合并,按照最佳实践建议,每个记录都包含一个自动数字 id 列。
所以,我有两种操作类型
- 存款
- 提现
我认为,如果我认为以 1 开头的每一行都是存款,如果以 2 开头的每一行都是取款,那么我认为对于这种情况是有效的。因此,要将两者连接起来,您最好在操作类型本身中添加一些零,例如,1 变为 10000000(如果添加 7 个 0)并假设此取款的自动数字 id 为 33。
然后你去:10000000+33 = 10000033
因此,如果你有一个 id 为 33 的提款记录,它不应该与我们的存款发生冲突(只要我们添加了足够的 0),因为它会变成类似:20000033。
明白了吗?好的,现在运行这个:
DELIMITER $$
CREATE FUNCTION renderVirtualId(part1 INT, part2 INT, len INT) RETURNS bigint(20) unsigned
NO SQL
BEGIN
return part1*POW(10,len)+part2;
end$$
DELIMITER;
然后你像这样编译你的视图:
CREATE OR REPLACE VIEW v_balance AS
SELECT renderVirtualId(1,id,10) as id,amount,account,datetime FROM deposits
UNION
SELECT renderVirtualId(2,id,10) as id,-amount,account,datetime FROM withdrawals
ORDER BY datetime DESC
希望你喜欢它。我确实做到了。