INSERT IGNORE INTO en Auto increment

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

N K

N K

25/07/2014 13:21:04
Quote Anchor link
In een for each loop gebruik ik "INSERT IGNORE INTO" om records toe te voegen.
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?
 
PHP hulp

PHP hulp

16/11/2024 23:03:29
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/07/2014 13:32:10
Quote Anchor link
Door een UNIQUE INDEX te zetten op de (combinatie van) kolommen die geen dubbele waardes mogen bevatten.

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
 
N K

N K

25/07/2014 13:44:17
Quote Anchor link
Die snap ik niet helemaal Ger. Ik heb in die tabel geen enkele kolom die uniek hoeft te zijn behalve het id.
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)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/07/2014 13:58:45
Quote Anchor link
Hoe bepaal je dan dat het duplicaten zijn?
 
N K

N K

25/07/2014 14:24:25
Quote Anchor link
Na het lezen van dit 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..
 
- SanThe -

- SanThe -

25/07/2014 15:39:42
Quote Anchor link
INSERT ... ON DUPLICATE UPDATE misschien?
 
N K

N K

25/07/2014 16:17:41
Quote Anchor link
Helaas die auto increment gooit roet in het eten
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/07/2014 16:59:25
Quote Anchor link
Dat topic op SO gaat heel ergens anders over, nl. dat de AI waarde met één (of meer) wordt opgehoogd bij een INSERT IGNORE (of een UPSERT) query.

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).
 
N K

N K

25/07/2014 17:09:24
Quote Anchor link
#$@*& 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..
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/07/2014 19:24:57
Quote Anchor link
Om je misschien een heel verhaal te besparen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"
);
?>
Gewijzigd op 25/07/2014 19:26:39 door Ger van Steenderen
 
N K

N K

25/07/2014 19:41:03
Quote Anchor link
Hoi Ger
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/07/2014 20:19:29
Quote Anchor link
Ik had even het idee dat je data ging overhevelen van de ene naar de andere tabel, maar dat is met externe data natuurlijk niet het geval.

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).
 
N K

N K

25/07/2014 21:12:16
Quote Anchor link
Top! Dat werkt inderdaad. Scheelt me weer code.
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/07/2014 20:32:26
Quote Anchor link
De regel is dat elke tabel een primary key moet hebben.

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)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.