Avatar billede ruma1974 Nybegynder
01. november 2008 - 13:20 Der er 10 kommentarer og
1 løsning

sammensæt to tabler er langsomt

Hej,

Jeg ønsker at sammensætte to tabler.

tabel 1:

ID navn
1 Rune
2 Hans
...

tabel 2:

ID efternavn
1 Jensen
2 Hansen
...

Dettte gør jeg med følgende steps:

Tilføj søjle til tabel1
1. ALTER TABLE tabel1 ADD COLUMN efternavn;
2. UPDATE table1 SET efternavn = tabel2.efternavn where ID=tabel2.ID;

Problemet er at step 2 tager meget lang tid (en hel aften). En alternative method er at skrive tabel 1 og 2 ud som text file merge de to text filer (tager 20 sekunder med eget program) og derefter uploade de to merged tabler. Den sidst løsning kræver mere arbejde.

Så mit spørgsmål er om dette kan gøres hurtigere udelukkende ved brug af MySQL?

Mvh,

Rune
Avatar billede arne_v Ekspert
01. november 2008 - 13:25 #1
#2 er vist ikke tastet rigtigt ind.

UPDATE table1 SET efternavn = (SELECT efternavn FROM tabel2 WHERE tabel2.id=tabel1.id;

hvis id er primary key eller der er et andet index på id i begge tabeller, så bør
det køre rimeligt hurtigt op til mellemstore data.
Avatar billede ruma1974 Nybegynder
01. november 2008 - 13:54 #2
Efter at jeg har sat begge ID til primary keys køre det ganske rigtigt hurtigt men af en eller anden grund bliver efternavn ikke opdateret og forbliver null. Kan ikke lige på nuværende tidspunkt se hvad jeg gør galt.
Avatar billede ruma1974 Nybegynder
01. november 2008 - 18:07 #3
Både din og min syntax køre fint og hurtigt men ingen updatering (MySQL 4.0)
Avatar billede arne_v Ekspert
01. november 2008 - 18:14 #4
Jeg ved at min syntax ikke virker med MySQL 4.0.

Jeg ved at din syntax ikke er valid i nogen MySQL version.

Jeg tror at du skal have slået noget "vis fejl" til.
Avatar billede ruma1974 Nybegynder
01. november 2008 - 18:25 #5
Dit forslag (dog tilført ")" tilsidst):

UPDATE annotation_matrix SET annotation_matrix.gene = (select gene from temp where temp.ID=unigene);

Min oprindelig syntax med rigtig data:

update annotation_matrix, temp set annotation_matrix.gene=temp.ID where annotation_matrix.unigene=temp.gene;

Jeg bruger MySQL query browser og kan normalt godt se hvis der er fjel. Begge syntax ovenfor giver følgende beskeder:

Query is beeing executed...
Query returened no resultset

Følgenede er fra MySQL documentation:

It took me a few minutes to figure this out, but the syntax for UPDATING ONE TABLE ONLY using a relationship between two tables in MySQL 4.0 is actually quite simple:

update t1, t2 set t1.field = t2.value where t1.this = t2.that;
Avatar billede arne_v Ekspert
01. november 2008 - 18:36 #6
Hvis du ikke får fejl på mit forslag, så check lige MySQL version med:

SELECT VERSION()

Den syntax du angiver der bør virke, men det var ikke den du brugte i dit spørgsmål - der
havde du kun 1 tabel navn.

UPDATE returnerer aldrig et result set, så den meddelse betyder ikke, at de ikke har opdateret.
Avatar billede ruma1974 Nybegynder
01. november 2008 - 20:35 #7
SELECT VERSION()
'4.1.22-community-nt'

Ja, helt enig jeg forvendter ikke et resultat sæt - problemet er bare at når jeg efterfølgende køre:

SELECT * FROM annotation_matrix a;

Så er annotation_matrix uændret.
Avatar billede arne_v Ekspert
01. november 2008 - 22:53 #8
Og der er matchende felter ?

Og der er ikke små forskelle med mellemrum eller sådan noget ?
Avatar billede ruma1974 Nybegynder
02. november 2008 - 14:35 #9
Jeg beklager - det var en dårlig dag i går. Jeg var sikker på at jeg allerede havde checkede for små forskelle i primary keys for de to tabeller. Men nu da du nævnte muligheden chekkede jeg en ekstra gang og ja der var narturligvis en space til forskel.

Du fortejner points for hjælpen.

Jeg beklager ulejligheden.

Konklussionen for mig er at MySQL faktisk updatere ligeså hurtigt som mit eget program når jeg laver updateringen i MySQL rigtigt.
Avatar billede arne_v Ekspert
02. november 2008 - 14:52 #10
svar
Avatar billede peet-49 Novice
07. november 2008 - 10:39 #11
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester