MySQL: combi van CONCAT/SHA niet functioneel

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Bastiaan
  • Registratie: November 2002
  • Laatst online: 01:08

Bastiaan

Bas·ti·aan (de, m)

Topicstarter
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:

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?

Beste antwoord (via Bastiaan op 09-03-2020 18:34)


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 08:57

Matis

Rubber Rocket

GieltjE schreef op maandag 9 maart 2020 @ 18:16:
Dat is soms niet mogelijk, we laden b.v. de DPD routing table in, als je daar pre MariaDB 10.4 de officiele unique deed ging je ruimschoots over de limiet heen. Weet niet of zoiets hier van toepassing is.
Dat zou kunnen, maar zonder relevante aantallen en/of kolom-groottes blijft het gissen.

@Bastiaan waar komt die functie CONCAT vandaan? Daar heb ik (PHP5.3+) namelijk nog nooit van gehoord.

Edit; Ik denk dat ik al wel weet waarom het niet werkt en waarom het fout gaat. CONCAT is namelijk een MySQL functie :P

[ Voor 10% gewijzigd door Matis op 09-03-2020 18:21 ]

If money talks then I'm a mime
If time is money then I'm out of time

Alle reacties


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 08:57

Matis

Rubber Rocket

Je kunt toch ook een unique constraint ín de database opnemen op kolomA, B en E?

Daarnaast zul je moeten debuggen waarom de import niet lukt bij meerdere waardes hashen.
Zet daarnaast je error_reporting en error_logging aan.

[ Voor 49% gewijzigd door Matis op 09-03-2020 18:16 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • GieltjE
  • Registratie: December 2003
  • Laatst online: 04-10 22:00

GieltjE

Niks te zien...

Matis schreef op maandag 9 maart 2020 @ 18:14:
Je kunt toch ook een unique constraint ín de database opnemen op kolomA, B en E?
Dat is soms niet mogelijk, we laden b.v. de DPD routing table in, als je daar pre MariaDB 10.4 de officiele unique deed ging je ruimschoots over de limiet heen. Weet niet of zoiets hier van toepassing is.

Hell / 0


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 08:57

Matis

Rubber Rocket

GieltjE schreef op maandag 9 maart 2020 @ 18:16:
Dat is soms niet mogelijk, we laden b.v. de DPD routing table in, als je daar pre MariaDB 10.4 de officiele unique deed ging je ruimschoots over de limiet heen. Weet niet of zoiets hier van toepassing is.
Dat zou kunnen, maar zonder relevante aantallen en/of kolom-groottes blijft het gissen.

@Bastiaan waar komt die functie CONCAT vandaan? Daar heb ik (PHP5.3+) namelijk nog nooit van gehoord.

Edit; Ik denk dat ik al wel weet waarom het niet werkt en waarom het fout gaat. CONCAT is namelijk een MySQL functie :P

[ Voor 10% gewijzigd door Matis op 09-03-2020 18:21 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Bastiaan
  • Registratie: November 2002
  • Laatst online: 01:08

Bastiaan

Bas·ti·aan (de, m)

Topicstarter
Matis schreef op maandag 9 maart 2020 @ 18:19:
[...]
Edit; Ik denk dat ik al wel weet waarom het niet werkt en waarom het fout gaat. CONCAT is namelijk een MySQL functie :P
Oh werkelijk waar, nee toch... Mondays |:(

Acties:
  • +1 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Bastiaan schreef op maandag 9 maart 2020 @ 17:50:
[...] maar ook omdat er geen foutmeldingen verschijnen. [...]
Ok, dan zul je hier dus ook even naar moeten kijken: https://www.php.net/manual/en/ref.errorfunc.php ;)

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron

Pagina: 1