Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: novotný 14. 10. 2016, 07:49:04
-
Zdar, mám dvě tabulky v MariaDB, kde jsou téměř totožní data.
První tabulka má data ze včerejška a druhá z dneška.
Změn je tak 1% z celkového počtu dat (řádků cca 10 000, sloupců 20).
Sloupce jsou převážně stringy (12 sloupců VARCHAR(15), 8 sloupců INT).
Jak by ste doporučovali hledat změny v datech?
-
Zdar, mám dvě tabulky v MariaDB, kde jsou téměř totožní data.
První tabulka má data ze včerejška a druhá z dneška.
Změn je tak 1% z celkového počtu dat (řádků cca 10 000, sloupců 20).
Sloupce jsou převážně stringy (12 sloupců VARCHAR(15), 8 sloupců INT).
Jak by ste doporučovali hledat změny v datech?
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
Pokud hledáte co není v tabulce t1 a je v tabulce t2:
SELECT * FROM t1 WHERE t1.key_content NOT IN (SELECT t2.key_content FROM t2)
Pokud hledáte co není v obou tabulkách současně pak
SELECT * FROM t2, t2 WHERE t1.reference = t2.reference AND t1.key_content <> t2.key_content
-
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
-
Záleží, co potřebuješ. Také je možné pustit diff na sql dumpech
http://stackoverflow.com/questions/225772/compare-two-mysql-databases/8718572#8718572
-
a co tak pouzit proste minus, s vynechanim technickych sloupcu?
select
columns ....
from t1
minus
select
columns ....
from t2
-
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content
Díky, to je ono.
-
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
-
V MariaDB existuje i funkce CONCAT_WS, která umožňuje zadat oddělovač jako parametr.
-
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
CONCAT('aa|', '|', 'bb') -> 'aa||bb'
CONCAT('aa', '|', '|bb') -> 'aa||bb'
-
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
CONCAT('aa|', '|', 'bb') -> 'aa||bb'
CONCAT('aa', '|', '|bb') -> 'aa||bb'
Ano, to je pravda, moc jsem o detailním řešení nepřemýšlel, ale řešitelné to je:
CONCAT_WS('|', TO_BASE64(pole_1), ...)
-
Nevím, zda to má konrétně MariaDB, ale v ANSI SQL jde použít konstrukce:
select * from table1
where (c1, c2, c3, c4, c5, c6) not in (select c1, c2, c3, c4, c5, c6 from table2)
http://stackoverflow.com/questions/2956048/sql-where-x-in-select-y-from
Ještě jsem viděl použití outer joinu:
select t1.*, t2.id as t2id from table1 t1 left outer join table2 t2 on t1.c1 = t2.c1 ....
A z toho pak vyfiltrovat záznamy, kde t2id je null.
Případně se poohlédnout po EXISTS, respektive NOT EXISTS