Ik probeer data vanuit een CSV via PHP te importeren in een MySQL-database. Dat gaat in feite probleemloos, maar ik wil een eigen veld toevoegen welke gebruikt wordt als unieke sleutel. De historische data is statisch, dus het is alleen ter voorkoming van dubbele invoer. De (sterk vereenvoudigde) import ziet er als volgt uit:
Het probleem is dat iedere waarde los van elkaar een paar keer voor kan komen. Bijvoorbeeld: waarde_1, waarde_2 en waarde_5 kunnen los van elkaar in meerdere rijen voorkomen, maar de combinatie van die drie in een rij kan alleen maar uniek zijn. Helaas is er in het CSV-bestand geen uniek ID beschikbaar, dus de manier waarop ik een unieke check wil bereiken is een combinatie van meerdere kolommen te pakken, die te hashen, en de waarde daarvan vervolgens op aanwezigheid in een kolom te checken. Dat is waar in bovenstaande code regel 8 en 13 aan bod komen.
Echter, wanneer ik een enkele waarde hash wordt data zonder problemen weggeschreven. Als ik een combinatie van waarden pak door middel van CONCAT, wordt er niets geïmporteerd. Ik krijg niet helder waarom niet, omdat in andere queries (zonder hash) ik wel data kan importeren/exporteren waarin ook samenvoegingen zitten, maar ook omdat er geen foutmeldingen verschijnen. Het maakt daarbij ook geen verschil welke bitwaarde of hashvorm ik gebruik. Sowieso is dat laatste niet interessant; het gaat niet om de versleuteling, maar alleen om iets te genereren dat als unieke sleutel kan fungeren.
Als tip wordt op verschillende plekken aangeraden om 'SELECT' te gebruiken in plaats van 'VALUES', maar ik merk in de werking vervolgens geen verschil. Ik loop nu uiteindelijk vast met twee vragen:
1. Omdat alleen gesproken wordt over database-updates bij checken van een sleutel i.p.v. een volledige regel: is dit überhaupt de beste workaround om een unieke sleutel te maken?
2. Hoe krijg ik CONCAT van meerdere velden in combinatie met een willekeurige hash verwerkt?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| [...] $gedefinieerde_waarde_1 = $csv_column[1]; $gedefinieerde_waarde_2 = $csv_column[2]; $gedefinieerde_waarde_3 = $csv_column[3]; $gedefinieerde_waarde_4 = $csv_column[4]; $gedefinieerde_waarde_5 = addslashes($csv_column[5]); $hashed = CONCAT($gedefinieerde_waarde_1,$gedefinieerde_waarde_2,gedefinieerde_waarde_5); $sql = "INSERT INTO le_database ( hash, kolomA, kolomB, kolomC, kolomD, kolomE) VALUES ( SHA2($hashed, 256), // In de database geconfigureerd als VARCHAR(64). '$gedefinieerde_waarde_1', '$gedefinieerde_waarde_2', '$gedefinieerde_waarde_3', '$gedefinieerde_waarde_4', '$gedefinieerde_waarde_5') "; $result = $this->conn->query($sql); [...] |
Het probleem is dat iedere waarde los van elkaar een paar keer voor kan komen. Bijvoorbeeld: waarde_1, waarde_2 en waarde_5 kunnen los van elkaar in meerdere rijen voorkomen, maar de combinatie van die drie in een rij kan alleen maar uniek zijn. Helaas is er in het CSV-bestand geen uniek ID beschikbaar, dus de manier waarop ik een unieke check wil bereiken is een combinatie van meerdere kolommen te pakken, die te hashen, en de waarde daarvan vervolgens op aanwezigheid in een kolom te checken. Dat is waar in bovenstaande code regel 8 en 13 aan bod komen.
Echter, wanneer ik een enkele waarde hash wordt data zonder problemen weggeschreven. Als ik een combinatie van waarden pak door middel van CONCAT, wordt er niets geïmporteerd. Ik krijg niet helder waarom niet, omdat in andere queries (zonder hash) ik wel data kan importeren/exporteren waarin ook samenvoegingen zitten, maar ook omdat er geen foutmeldingen verschijnen. Het maakt daarbij ook geen verschil welke bitwaarde of hashvorm ik gebruik. Sowieso is dat laatste niet interessant; het gaat niet om de versleuteling, maar alleen om iets te genereren dat als unieke sleutel kan fungeren.
Als tip wordt op verschillende plekken aangeraden om 'SELECT' te gebruiken in plaats van 'VALUES', maar ik merk in de werking vervolgens geen verschil. Ik loop nu uiteindelijk vast met twee vragen:
1. Omdat alleen gesproken wordt over database-updates bij checken van een sleutel i.p.v. een volledige regel: is dit überhaupt de beste workaround om een unieke sleutel te maken?
2. Hoe krijg ik CONCAT van meerdere velden in combinatie met een willekeurige hash verwerkt?