[MYSQL] tabel aanvullen met nieuwe gegevens

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

  • klaaz
  • Registratie: April 2000
  • Laatst online: 31-03 21:51

klaaz

it's me!

Topicstarter
Ik heb een basistabel met zo'n 27.000 records die ik wil aanvullen met gegevens uit een updatetabel. In de updatetabel staan dezelfde gegevens als in de basistabel, aangevuld met nieuwe records.

Nu lees ik de update tabel uit, en zoek per regel in de basistabel of het record al bestaat. Zo ja, dan wordt deze overgeslagen, zo nee dan wordt het record toegevoegd aan de basis tabel.

een eenvoudige constructie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$updatenumber = 0;
$addnumber = 0;

$query1 = "SELECT * FROM updatebestand ORDER BY clientid";
$result1 = mysql_query($query1) or die("Oeps! Query fout!  MySQL zegt: ".mysql_error()." En PHP zegt: $error_msg");
while ($rowupdate = mysql_fetch_object($result1))
  {
    $query2 = "SELECT * FROM basisbestand WHERE clientid = '".$rowupdate->clientid."'";
    $result2 = mysql_query($query2) or die("Oeps! Query fout!  MySQL zegt: ".mysql_error()." En PHP zegt: $error_msg");
    if (mysql_num_rows($result2) == 0)
      {
        // toevoegen
        $addnumber++;
      }
    else
      {
        // updaten
        $updatenumber++;
      }
  }
$uploadmessage .= "Aantal updates: ".$updatenumber." / Aantal toevoegingen: ".$addnumber++."<br />";


Gewoon een simpel testje dus om te kijken of de constructie werkt. Het script loopt echter eindeloos. Is er een sneller en efficiëntere methode om dit soort dingen te doen? Ik heb me redelijk suf gezocht op GoT en Google maar kom er niet uit...

[ Voor 14% gewijzigd door klaaz op 16-10-2005 02:43 ]


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 31-03 00:11

mcB

Als een korte downtime van je db geen probleem is zou ik gewoon de hele tabel leeggooien en alle data er opnieuw inzetten vanuit de updatetabel.
Is de beschikbaarheid van de DB en de gegevens daarin wel van belang danzou ik het gewoon op de manier doen zoals jij al beschreven hebt.

Als je MySQL versie >= 4.1 dan zou je in je code gebruik kunnen maken van subqueries. Echter, aangezien de queries dan ook allemaal uitgevoerd moeten worden zou de db belasting gelijk blijven en schiet je er niet meer mee op dan mooiere code.

Strix (Skullflame)


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

code:
1
2
DROP TABLE basis_table
ALTER TABLE update_table RENAME TO basis_table


Klaar.

[ Voor 4% gewijzigd door CyBeR op 16-10-2005 03:01 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • MikeN
  • Registratie: April 2001
  • Laatst online: 10:09
REPLACE INTO ipv INSERT INTO is misschien ook een mogelijkheid als je de tabel persé niet wil hernoemen.

  • klaaz
  • Registratie: April 2000
  • Laatst online: 31-03 21:51

klaaz

it's me!

Topicstarter
Een klein, en niet vermeld probleem is dat er in de basistabel extra velden staan die door webusers zijn ingevuld/aangevuld. Deze moete dus gehandhaafd blijven...

Dus in de query worden alleen de standaardvelden meegenomen, waarbij de extra velden met rust worden gelaten.

In het bovenstaande voorbeeld gebruikt ik nog geen enkele update query, slechts een voorbeeld. Toch loopt dit voorbeeld script al eindeloos wat doet vrezen voor de uiteindelijke code MET insert en replace query's... :(

Is er nu echt geen efficientere methode voor dit soort acties?

[ Voor 65% gewijzigd door klaaz op 16-10-2005 11:42 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:50
Tuurlijk gaat dat traag, per rij in je ene tabel doe je een aantal queries.

Is het gewoon niet beter om 2 queries te doen:
eentje waarbij je de nieuwe records insert
eentje waarbij je de bestaande records updated:

code:
1
2
3
insert into basistabel(bla, bla, bal)
select veld, veld, veld from updatetabel where updatetabel.id not in 
 ( select id from basistabel)


en
code:
1
2
3
4
update basistabel
  set veld = updatetabel.veld, ...
from updatetabel
where basistabel.id = updatetabel.id

https://fgheysels.github.io/


  • Boss
  • Registratie: September 1999
  • Laatst online: 04-04 17:47

Boss

+1 Overgewaardeerd

Wat dacht je van een goeie JOIN en dan kijken welke records wel in de ene en niet in de andere tabel staan? Echt, dit is de meest trage manier om dit te doen!

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • NightBird
  • Registratie: Januari 2000
  • Laatst online: 04-04 17:20

NightBird

DPC-Crew Coding
Als je wilt dat het snel is moet je beide tabellen in je script inlezen en dan de 'nieuwe' tabel in geheugen vergelijken met de oude. Je gooit dan alles weg uit je nieuwe array wat al in de oude zat en doet vervolgens een insert voor alle overgebleven records.

WatHoorJeWaar · Asobakken
Eerdere projecten: Leading Courses · Brandstof-zoeker.nl · Voertuig-zoeker.nl

Pagina: 1