/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Opfølgning + Spørgsmål om PEAR
Fra : Jimmy


Dato : 27-12-03 23:38

Davs

Jeg skrev for nogle måneder siden, at jeg syntes det var en fantastisk ide
at indsætte en tom række i en MySQL-DB for derefter at trække
LAST_INSERT_ID() ud, så man kunne konvertere en INSERT til en UPDATE, som er
væsentligt lettere at vedligeholde og overskue.

Jeg er imidlertid ikke længere så begejstret for ideen uden at man samtidig
låser tabellen (med de ulemper det medfører).
Jeg oplevede at et cron-job importerede data fra den tomme række, da begge
scripts (på forskellige maskiner) blev udført samtidig.

Jeg mener det var en Jacob/Jakob der sagde, at PEAR klarede
INSERT->UPDATE-konverteringen native og var et bedre alternativ.

Men hvordan gør PEAR egentligt?
Gør den som jeg eller låser den først eller noget helt tredie?

Mvh
Jimmy





 
 
Christian Joergensen (28-12-2003)
Kommentar
Fra : Christian Joergensen


Dato : 28-12-03 10:53

On Sat, 27 Dec 2003 23:37:54 +0100, Jimmy wrote:

[LAST_INSERT_ID()]

> Men hvordan gør PEAR egentligt?
> Gør den som jeg eller låser den først eller noget helt tredie?

Her brug du en sequence emulation. Kodemæssigt ser det sådan her ud:

$dbh->query("INSERT INTO heste (id, navn, farve) VALUES (?, ?)",
array($dbh->nextId('heste'),
"Lotte",
"Lyserød"));

Det, den gør ved databaser der ikke direkte understøtter sequences (som
fx. MySQL), er at den opretter en støtte-tabel med navnet
"sekvensnavn_seq" indeholdende en kolonne med en række. Her i gemmes det
tal du nu engang er nået til i din sekvens, hvilket giver dig sikkerhed
for at du med nextId() altid vil få et unikt identifikationsnummer

--
Christian Jørgensen | Use the Source, Luke!
http://www.razor.dk |


Christian Joergensen (28-12-2003)
Kommentar
Fra : Christian Joergensen


Dato : 28-12-03 10:55

On Sun, 28 Dec 2003 10:53:25 +0100, Christian Joergensen wrote:

> $dbh->query("INSERT INTO heste (id, navn, farve) VALUES (?, ?)",

Der var lige en forsinket drillenisse - der skulle stå:

$dbh->query("INSERT INTO heste (id, navn, farve) VALUES (?, ?, ?)",

--
Christian Jørgensen | If ignorance is bliss
http://www.razor.dk | - then knock the smile off my face ;)


Jimmy (28-12-2003)
Kommentar
Fra : Jimmy


Dato : 28-12-03 11:15


"Christian Joergensen" <mail@phpguru.dk> wrote in message
news:pan.2003.12.28.09.53.24.955593@razor.dk...

> Det, den gør ved databaser der ikke direkte understøtter sequences (som
> fx. MySQL), er at den opretter en støtte-tabel med navnet
> "sekvensnavn_seq" indeholdende en kolonne med en række. Her i gemmes det
> tal du nu engang er nået til i din sekvens, hvilket giver dig sikkerhed
> for at du med nextId() altid vil få et unikt identifikationsnummer


Jeg er ikke med på hvordan den sikrer sig, at to brugere ikke modtager samme
ID?

Det, som jeg synes er smart er følgende:

INSERT INTO tabel () VALUES ()
Last_ID = SELECT LAST_INSERT_ID()

UPDATE tabel SET
felt1 = vaerdi1,
felt2 = vaerdi2,
...
WHERE ID = Last_ID


Den sidste SQL er langt mere overskuelig end den tilsvarende direkte INSERT,
hvor det er noget sværere at stille navn og værdi-par på en letlæselig måde,
når der er mange.

PEAR skulle kunne gøre noget lignende på alle database-systemer, men jeg kan
slet ikke se, hvordan den kan finde det ID MySQL har tænkt sig at bruge
næste gang, tildele det til mig og samtidig sørge for at andre ikke får det
uden at bruge en lås.

Eller har jeg misforstået det så PEAR i virkelighed slet ikke arbejder med
kolonnetypen AUTO_INCREMENT ?

Mvh
Jimmy



Mads Lie Jensen (28-12-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 28-12-03 13:04

On Sun, 28 Dec 2003 11:14:32 +0100, "Jimmy"
<nyhedsgruppe2@get2net.danmark> wrote:

>> Det, den gør ved databaser der ikke direkte understøtter sequences (som
>> fx. MySQL), er at den opretter en støtte-tabel med navnet
>> "sekvensnavn_seq" indeholdende en kolonne med en række. Her i gemmes det
>> tal du nu engang er nået til i din sekvens, hvilket giver dig sikkerhed
>> for at du med nextId() altid vil få et unikt identifikationsnummer
>
>Jeg er ikke med på hvordan den sikrer sig, at to brugere ikke modtager samme
>ID?

Den bruger internt også last_insert_id(), men på den tabel hvor
sequencen er gemt - ikke på den tabel du vil indsætte i.


>Det, som jeg synes er smart er følgende:
>
>INSERT INTO tabel () VALUES ()
>Last_ID = SELECT LAST_INSERT_ID()
>
>UPDATE tabel SET
> felt1 = vaerdi1,
> felt2 = vaerdi2,
> ...
>WHERE ID = Last_ID
>
>
>Den sidste SQL er langt mere overskuelig end den tilsvarende direkte INSERT,
>hvor det er noget sværere at stille navn og værdi-par på en letlæselig måde,
>når der er mange.

I mysql kan du sagtens lave
INSERT INTO tabel SET felt=værdi, fet2=værdi ...;

>PEAR skulle kunne gøre noget lignende på alle database-systemer, men jeg kan
>slet ikke se, hvordan den kan finde det ID MySQL har tænkt sig at bruge
>næste gang, tildele det til mig og samtidig sørge for at andre ikke får det
>uden at bruge en lås.
>
>Eller har jeg misforstået det så PEAR i virkelighed slet ikke arbejder med
>kolonnetypen AUTO_INCREMENT ?

I princippet gør den ikke, for det er svjv kun i mysql at AUTO_INCREMENT
findes - at den så i praksis tilsyneladende benytter sig at det til at
emulere sequences er en anden sag.


--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk
Kig også ind på http://hjoerringnyplanteskole.dk/

Jimmy (28-12-2003)
Kommentar
Fra : Jimmy


Dato : 28-12-03 13:17


"Mads Lie Jensen" <mads@gartneriet.dk> wrote in message
news:4tgtuvc9blenv3tji32srvu130aikmu7mq@4ax.com...
> On Sun, 28 Dec 2003 11:14:32 +0100, "Jimmy"
> <nyhedsgruppe2@get2net.danmark> wrote:
>
> >> Det, den gør ved databaser der ikke direkte understøtter sequences (som
> >> fx. MySQL), er at den opretter en støtte-tabel med navnet
> >> "sekvensnavn_seq" indeholdende en kolonne med en række. Her i gemmes
det
> >> tal du nu engang er nået til i din sekvens, hvilket giver dig sikkerhed
> >> for at du med nextId() altid vil få et unikt identifikationsnummer
> >
> >Jeg er ikke med på hvordan den sikrer sig, at to brugere ikke modtager
samme
> >ID?
>
> Den bruger internt også last_insert_id(), men på den tabel hvor
> sequencen er gemt - ikke på den tabel du vil indsætte i.

Så hver gang der tildeles et ID henter den det fra sin egen tabel?

Betyder det at AUTO_INCREMENT populeres af de ID'er den henter fra sin egen
tabel?
Hvis jeg indsætter en række i hovedtabellen udenom PEAR bliver dens sequence
jo ikke opdateret.
Vil det så fejle?

Det er helt sort for mig det der system som I nok kan høre på mine spørgsmål



> >Det, som jeg synes er smart er følgende:
> >
> >INSERT INTO tabel () VALUES ()
> >Last_ID = SELECT LAST_INSERT_ID()
> >
> >UPDATE tabel SET
> > felt1 = vaerdi1,
> > felt2 = vaerdi2,
> > ...
> >WHERE ID = Last_ID
> >
> >
> >Den sidste SQL er langt mere overskuelig end den tilsvarende direkte
INSERT,
> >hvor det er noget sværere at stille navn og værdi-par på en letlæselig
måde,
> >når der er mange.
>
> I mysql kan du sagtens lave
> INSERT INTO tabel SET felt=værdi, fet2=værdi ...;

Langt ude!
Det virker jo!
Jeg har aldrig set noget lignende. Er det en ofte brugt syntaks?
Jeg vil da helt sikkert bruge den fremover når jeg har fundet den beskrevet
på mysql.com.


> >PEAR skulle kunne gøre noget lignende på alle database-systemer, men jeg
kan
> >slet ikke se, hvordan den kan finde det ID MySQL har tænkt sig at bruge
> >næste gang, tildele det til mig og samtidig sørge for at andre ikke får
det
> >uden at bruge en lås.
> >
> >Eller har jeg misforstået det så PEAR i virkelighed slet ikke arbejder
med
> >kolonnetypen AUTO_INCREMENT ?
>
> I princippet gør den ikke, for det er svjv kun i mysql at AUTO_INCREMENT
> findes - at den så i praksis tilsyneladende benytter sig at det til at
> emulere sequences er en anden sag.

Access har en autonumber som er identisk. Har MSSQL ikke også en der hedder
@IDENTITY?


Mvh
Jimmy



Mads Lie Jensen (28-12-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 28-12-03 15:03

On Sun, 28 Dec 2003 13:16:51 +0100, "Jimmy"
<nyhedsgruppe2@get2net.danmark> wrote:

>> Den bruger internt også last_insert_id(), men på den tabel hvor
>> sequencen er gemt - ikke på den tabel du vil indsætte i.
>
>Så hver gang der tildeles et ID henter den det fra sin egen tabel?

Du kender ikke noget til sequences overhovedet, vel?

En sequence i f.eks postgresql er 'bare' en talrække. Du beder om et tal
fra den og den tæller en op (eller hvor mange den nu er sat til at tælle
op). Hvordan den gør det er ret ligegyldigt, så længe det virker

mysql har ikke sequences, så derfor må det ordnes på anden vis, det gør
pear::db så. Fra din side er det så ligegyldigt om databasen du bruger
har ægte sequences eller de emuleres.

>Betyder det at AUTO_INCREMENT populeres af de ID'er den henter fra sin egen
>tabel?

Når du bruger nextId()-funktionen får du næste idnummer i rækken. Jeg
kan ikke helt gennemskue hvordan de har gjort det, men du kan jo selv se
i koden til Pear::db

>Hvis jeg indsætter en række i hovedtabellen udenom PEAR bliver dens sequence
>jo ikke opdateret.
>Vil det så fejle?

Sikkert - eller - måske.
Det kommer jo helt an på om du bruger et id-nummer som senere kommer i
rækken af tal i din sequence.

>> I mysql kan du sagtens lave
>> INSERT INTO tabel SET felt=værdi, fet2=værdi ...;
>
>Langt ude!
>Det virker jo!
>Jeg har aldrig set noget lignende. Er det en ofte brugt syntaks?

Næppe - det virker vist kun i mysql - i postgresql kan man i hvert fald
ikke.

>Jeg vil da helt sikkert bruge den fremover når jeg har fundet den beskrevet
>på mysql.com.

http://www.mysql.com/doc/en/INSERT.html

>> I princippet gør den ikke, for det er svjv kun i mysql at AUTO_INCREMENT
>> findes - at den så i praksis tilsyneladende benytter sig at det til at
>> emulere sequences er en anden sag.
>
>Access har en autonumber som er identisk. Har MSSQL ikke også en der hedder
>@IDENTITY?

Kender ikke mssql og det er lææænge siden jeg holdt op med at bruge
access (eller, dvs. jeg bruger den som frontend til noget, men
tabellerne er for længst skiftet til mysql/postgresql og en
odbc-driver.)

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk
Kig også ind på http://hjoerringnyplanteskole.dk/

Jimmy (28-12-2003)
Kommentar
Fra : Jimmy


Dato : 28-12-03 16:05


"Mads Lie Jensen" <mads@gartneriet.dk> wrote in message
news:qqntuv8u973adh9jauua822jpc78d07a6l@4ax.com...
> On Sun, 28 Dec 2003 13:16:51 +0100, "Jimmy"
> <nyhedsgruppe2@get2net.danmark> wrote:
>
> >> Den bruger internt også last_insert_id(), men på den tabel hvor
> >> sequencen er gemt - ikke på den tabel du vil indsætte i.
> >
> >Så hver gang der tildeles et ID henter den det fra sin egen tabel?
>
> Du kender ikke noget til sequences overhovedet, vel?

Absolut intet.


> En sequence i f.eks postgresql er 'bare' en talrække. Du beder om et tal
> fra den og den tæller en op (eller hvor mange den nu er sat til at tælle
> op). Hvordan den gør det er ret ligegyldigt, så længe det virker

OK - Nu er jeg med.


> >Hvis jeg indsætter en række i hovedtabellen udenom PEAR bliver dens
sequence
> >jo ikke opdateret.
> >Vil det så fejle?
>
> Sikkert - eller - måske.
> Det kommer jo helt an på om du bruger et id-nummer som senere kommer i
> rækken af tal i din sequence.

Ja, det var det jeg mente.
Med PEAR bruger man så slet ikke MySQL's indbyggede AUTO_INCREMENT så vidt
jeg kan læse ud fra det I skriver.
Det er for så vidt også fint nok - jeg skulle blot forstå hvordan de kunne
garantere unikke numre til hver bruger i et flerbrugersystem når man brugte
AUTO_INCREMENT.


> >> I mysql kan du sagtens lave
> >> INSERT INTO tabel SET felt=værdi, fet2=værdi ...;
> >
> >Langt ude!
> >Det virker jo!
> >Jeg har aldrig set noget lignende. Er det en ofte brugt syntaks?
>
> Næppe - det virker vist kun i mysql - i postgresql kan man i hvert fald
> ikke.

OK, jeg mente nu også om det var en hyppigt brugt syntaks blandt MySQL-folk.


> >Jeg vil da helt sikkert bruge den fremover når jeg har fundet den
beskrevet
> >på mysql.com.
>
> http://www.mysql.com/doc/en/INSERT.html

Høhø - må have sprunget den over da jeg læste manualen.

Tak for hjælpen til alle i tråden.

Mvh
Jimmy





Mads Lie Jensen (28-12-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 28-12-03 16:50

On Sun, 28 Dec 2003 16:04:49 +0100, "Jimmy"
<nyhedsgruppe2@get2net.danmark> wrote:

>> >> I mysql kan du sagtens lave
>> >> INSERT INTO tabel SET felt=værdi, fet2=værdi ...;
>> >
>> >Langt ude!
>> >Det virker jo!
>> >Jeg har aldrig set noget lignende. Er det en ofte brugt syntaks?
>>
>> Næppe - det virker vist kun i mysql - i postgresql kan man i hvert fald
>> ikke.
>
>OK, jeg mente nu også om det var en hyppigt brugt syntaks blandt MySQL-folk.

Ved det ikke - det er ikke noget jeg har brugt. Men det er lige så meget
fordi jeg først for nylig fandt ud af at man kunne gøre sådan.


--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk
Kig også ind på http://hjoerringnyplanteskole.dk/

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408946
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste