INSERT IGNORE INTO en Auto increment
De records worden toegevoegd in een tabel die een auto increment heeft.
Nu worden er toch dubbele rijen ingevoegd m.i. doordat de autoincrement telkens ophoogd en dus het record als een uniek record ziet. Hoe zou ik dit kunnen oplossen zodat INSERT IGNORE INTO maar 1x een record invoegd?
Let op dat INSERT IGNORE doorgaat als er fouten gevonden worden, en niet specifiek bedoeld is om het invoeren van dubbele waardes te voorkomen.
Gewijzigd op 25/07/2014 13:36:23 door Ger van Steenderen
Doordat de for each meerdere keren dit record ophaalt wil ik hem maar 1x toevoegen in de tabel. Ik dacht dat ik hiervoor insert ignore kon gebruiken maar in combinatie met een auto increment op de tabel lijkt hij geen duplicaten te zien door de ophoging. (terwijl het wel duplicaten zijn)
Hoe bepaal je dan dat het duplicaten zijn?
http://stackoverflow.com/questions/6898136/insert-ignore-still-autoincrements-alternative-sql-query heb ik maar eerst een query gemaakt die checkt op een bestaand id. als dat bestaat dan slaat hij de insert over. Niet ideaal maar het werkt..
Na het lezen van dit INSERT ... ON DUPLICATE UPDATE misschien?
Helaas die auto increment gooit roet in het eten
Maar laat eens wat code en/of de opbouw van je tabellen zien, waar komen die gegevens die je in de foreach gebruikt vandaan (want daar ontstaan de duplicates).
#$@*& Heel verhaal getypt op mn mobiel, gaat de layout van de site raar doen. @mods kunnen we nog een app of responsive layout verwachten? Grr..
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$sel = mysqli_query($con, "SELECT kolom1, kolom2 FROM tabel1");
while ($row = mysqli_fetch_assoc($sel)) {
mysqli_query($con, "INSERT INTO tabel2 (kolom3, kolom4)
VALUES('" . $row['kolom1'] . "','" . $row['kolom2'] . "')");
}
// in één query
mysqli_query($con, "INSERT INTO tabel2 (kolom3, kolom4)
SELECT DISTINCT kolom1, kolom2 FROM tabel1");
?>
$sel = mysqli_query($con, "SELECT kolom1, kolom2 FROM tabel1");
while ($row = mysqli_fetch_assoc($sel)) {
mysqli_query($con, "INSERT INTO tabel2 (kolom3, kolom4)
VALUES('" . $row['kolom1'] . "','" . $row['kolom2'] . "')");
}
// in één query
mysqli_query($con, "INSERT INTO tabel2 (kolom3, kolom4)
SELECT DISTINCT kolom1, kolom2 FROM tabel1");
?>
Gewijzigd op 25/07/2014 19:26:39 door Ger van Steenderen
T/m regel 6 snap ik hem, maar wat doe je daarna vanaf regel 7?
Het werkt al maar ik zal het toch proberen te verduidelijken.
Ik ben bezig met de graph api van facebook. Ik krijg een response terug van alle events van een bepaalde venue. Ik wil periodiek een job draaien die deze events binnenhaalt. Nu kan het zijn dat hij soms toch dezelfde events (en venues) binnenhaalt.
Ik zet de velden in een database in mijn bestaande tabel "event" en "venue". Hierin worden ook events in weggeschreven die niet van facebook komen maar handmatig worden toegevoegd. Op deze tabellen heb ik een auto increment zitten. Daarnaast zet ik ook de event en venue-id's van facebook in dezelfde tabellen.
Ik wil dus de dubbelingen voorkomen. Als ik 10 events van dezelfde venue heb wil ik de venue uiteraard maar 1x in mijn database hebben.
Dit wil ik dus implementeren m.b.v. INSERT IGNORE INTO maar door de auto increment ziet mysql niet dat dit een dubbeling is.
Om dit te voorkomen check ik nu eerst of de facebook id's al bekend zijn in de tabellen. Zo ja dan sla ik de insert over.
Gewijzigd op 25/07/2014 19:44:38 door N K
Wat doe je met het Facebook id als handmatig ingevoerd wordt?
Als dat null is kan je namelijk nog steeds een unique index op die kolom zetten (raar maar waar).
Thanks!
Toevoeging op 26/07/2014 10:44:19:
Ger, nog 1 vraagje. Ik gebruik een auto-increment om de records uniek te identificeren. Nu gebruik ik deze ook in mijn url's wat ik eigenlijk niet mooi vind. Daarnaast lijkt het me ook niet wenselijk om die daar te hebben. Wat is de common practice om een uniek id van een record te maken t.b.v. bijv. URL's ? Moet ik de auto increment voor de URL hashen ofzo? Is een hash uniek?
Een primary key is een unique index met een not null constraint.
Dat men voor een PK een auto_increment (c.q serial - PG - , identity - MSSQL -) moet gebruiken is een veel gemaakte misvatting (men noemt deze niet voor niets surrogate keys). Zo ook dat het maar één kolom mag zijn.
In theorie heb je met elke hash functie kans op collisions, bij bv MD5 is dat 1 op 3.71e+19 (bijna net zo klein als dat ik de hoofdprijs in de staatsloterij win)