|
| [MySQL] AUTO_INCREMENT & mysql_insert_id()~ Fra : Morten Winther |
Dato : 10-04-01 19:40 |
|
Hej
Jeg kan se at MySQL genbruger de samme værdier igen hvis en record er
slettet fra en table. Kan dette ikke undgås således at der blot kommer
"huller" i rækken?
Jeg har kigget i manualen men kan ikke finde det afsnit, men man skulle tro
det var muligt - jeg mener at Access gør dette som standard.
Har nogen desuden sat sig ind i de forskellige former for tables: GEMINI,
ISAM, INNOBASE, MyISAM. Hvordan ser jeg hvilke typer tabeller jeg har?
En anden ting. Kan jeg ved stor load være sikker på at mysql_insert_id()
giver mig det rigtige id? Hvordan sikre MySQL og PHP at to brugere der
henetr den samme side på samme tid bliver kørt i 2 threads?
Followup-To: dk.edb.database
/ morten
| |
Jonas Koch Bentzen (10-04-2001)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 10-04-01 20:22 |
|
Morten Winther skrev:
> Kan jeg ved stor load være sikker på at
> mysql_insert_id() giver mig det rigtige id?
Lås tabellerne.
--
Venlig hilsen
Jonas Koch Bentzen
| |
Mads Lie Jensen (11-04-2001)
| Kommentar Fra : Mads Lie Jensen |
Dato : 11-04-01 20:28 |
|
On Tue, 10 Apr 2001 20:39:57 +0200, "Morten Winther" <mw@get2net.dk>
wrote:
>Jeg kan se at MySQL genbruger de samme værdier igen hvis en record er
>slettet fra en table. Kan dette ikke undgås således at der blot kommer
>"huller" i rækken?
Sådan var det i hvert fald i mySQL 3.22. Men i 3.23.et-eller-andet er
den vist blevet ændret til at gøre som du søger.
Manualen siger om default values:
For an AUTO_INCREMENT column, the default value is the next value in
the sequence.
--
Mads Lie Jensen
Mads@gartneriet.dk
ICQ #25478403
http://www.gartneriet.dk
| |
Dennis Haney (13-04-2001)
| Kommentar Fra : Dennis Haney |
Dato : 13-04-01 13:36 |
|
"Morten Winther" <mw@get2net.dk> skrev i en meddelelse
news:9avjv0$ffu$1@sunsite.dk...
> Hej
>
> Jeg kan se at MySQL genbruger de samme værdier igen hvis en record er
> slettet fra en table. Kan dette ikke undgås således at der blot kommer
> "huller" i rækken?
Et kendt problem med ISAM:
[SNIP]
An integer column may have the additional attribute AUTO_INCREMENT. When you
insert a value of NULL (recommended) or 0 into an AUTO_INCREMENT column, the
column is set to value+1, where value is the largest value for the column
currently in the table. AUTO_INCREMENT sequences begin with 1. See section
23.4.30 mysql_insert_id(). If you delete the row containing the maximum
value for an AUTO_INCREMENT column, the value will be reused with an ISAM
table but not with a MyISAM table. If you delete all rows in the table with
DELETE FROM table_name (without a WHERE) in AUTOCOMMIT mode, the sequence
starts over for both table types. NOTE: There can be only one AUTO_INCREMENT
column per table, and it must be indexed. MySQL Version 3.23 will also only
work properly if the auto_increment column only has positive values.
Inserting a negative number is regarded as inserting a very large positive
number. This is done to avoid precision problems when numbers 'wrap' over
from positive to negative and also to ensure that one doesn't accidently get
an auto_increment column that contains 0.
[SNAP]
>
> Jeg har kigget i manualen men kan ikke finde det afsnit, men man skulle
tro
> det var muligt - jeg mener at Access gør dette som standard.
Alle gør det som standard... Altså undtagen nogle dele af MySQL...
> Har nogen desuden sat sig ind i de forskellige former for tables: GEMINI,
> ISAM, INNOBASE, MyISAM. Hvordan ser jeg hvilke typer tabeller jeg har?
show table status like '%';
>
> En anden ting. Kan jeg ved stor load være sikker på at mysql_insert_id()
> giver mig det rigtige id?
Ja. Ellers ville der jo ligesom ikke være noget at bruge den til.
>Hvordan sikre MySQL og PHP at to brugere der
> henetr den samme side på samme tid bliver kørt i 2 threads?
Det gør din webserver. Det er ikke muligt at smide den samme side ud til to
på samme tid.
De skal jo begge have en TCP forbindelse.
Meen hvis du har sat dem op til at dele den samme databaseforbindelse så vil
du kunne se det med det samme...
Der er intet der virker ;)
(Det kan man komme til hvis man åbner forbindelsen i webserveren og ikke
fortæller,
at den altså skal åbne en ny hver gang den laver en ny tråd (Læs om
persistente databaseforbindelser)).
Dennis
| |
Morten Winther (13-04-2001)
| Kommentar Fra : Morten Winther |
Dato : 13-04-01 20:24 |
|
"Dennis Haney" <davh@davh.adsl.dk> wrote in message
news:9b6rvq$2qlh$1@news.cybercity.dk...
> >Hvordan sikre MySQL og PHP at to brugere der
> > henetr den samme side på samme tid bliver kørt i 2 threads?
>
> Det gør din webserver. Det er ikke muligt at smide den samme side ud til
to
> på samme tid.
> De skal jo begge have en TCP forbindelse.
> Meen hvis du har sat dem op til at dele den samme databaseforbindelse så
vil
> du kunne se det med det samme...
> Der er intet der virker ;)
> (Det kan man komme til hvis man åbner forbindelsen i webserveren og ikke
> fortæller,
> at den altså skal åbne en ny hver gang den laver en ny tråd (Læs om
> persistente databaseforbindelser)).
Jeg bruger netop følgende til at åbne databasen på alle mine filer:
$connection = mysql_pconnect($server, $user, $pass) or die("ingen forb til
sql server");
Men mysql_pconnect er måske ikke at foretrække når jeg skal være 100 procent
sikker på at mysql_insert_id() give det rigtige id ?
/ morten
| |
Christian Schmidt (15-04-2001)
| Kommentar Fra : Christian Schmidt |
Dato : 15-04-01 14:55 |
|
Morten Winther wrote:
>
> Men mysql_pconnect er måske ikke at foretrække når jeg skal være 100 procent
> sikker på at mysql_insert_id() give det rigtige id ?
Jo, det skal man ikke bekymre sig om. mysql_insert_id() returnerer id
for den seneste INSERT for den aktuelle forbindelse.
Christian
| |
Morten Winther (15-04-2001)
| Kommentar Fra : Morten Winther |
Dato : 15-04-01 22:53 |
|
"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3AD9A827.A4804823@schmidt.net...
> Morten Winther wrote:
> >
> > Men mysql_pconnect er måske ikke at foretrække når jeg skal være 100
procent
> > sikker på at mysql_insert_id() give det rigtige id ?
>
> Jo, det skal man ikke bekymre sig om. mysql_insert_id() returnerer id
> for den seneste INSERT for den aktuelle forbindelse.
Jeg har lavet lidt tests og fundet ud af at mysql_pconnect ikke er ok, da
forskellige bruger så deler databaseforbindelsen. Derfor bruger jeg nu
mysql_connect.
Hvor meget forskel er der i performence på mysql_pconnect og mysql_connect?
/ morten
| |
Christian Schmidt (15-04-2001)
| Kommentar Fra : Christian Schmidt |
Dato : 15-04-01 23:30 |
|
Morten Winther wrote:
>
> Jeg har lavet lidt tests og fundet ud af at mysql_pconnect ikke er ok, da
> forskellige bruger så deler databaseforbindelsen. Derfor bruger jeg nu
> mysql_connect.
Ikke helt forstået. Kan du ikke forklare/uddybe, hvorfor du ikke kan
bruge mysql_pconnect til dit formål?
Fra
< http://dk.php.net/manual/en/html/features.persistent-connections.html>:
"Persistent connections were designed to have one-to-one mapping to
regular connections. That means that you should always be able to
replace persistent connections with non-persistent connections, and it
won't change the way your script behaves."
Christian
| |
Morten Winther (16-04-2001)
| Kommentar Fra : Morten Winther |
Dato : 16-04-01 10:45 |
|
"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3ADA2102.C4CF8AF6@schmidt.net...
> Morten Winther wrote:
> >
> > Jeg har lavet lidt tests og fundet ud af at mysql_pconnect ikke er ok,
da
> > forskellige bruger så deler databaseforbindelsen. Derfor bruger jeg nu
> > mysql_connect.
>
> Ikke helt forstået. Kan du ikke forklare/uddybe, hvorfor du ikke kan
> bruge mysql_pconnect til dit formål?
Ja, jeg ved ikke lige hvordan jeg skal forklare det, men når jeg bruger
pconnect deler brugere samme pid til databasen.
Det vil sige at hvis jeg kalder mysql_insert_id() kan du jo tage id'et der
hører til en anden burger.
Hvis man burger mysql_pconnect vil 2 brugere få same id gennem følgende:
$sql_pid ="SHOW PROCESSLIST";
$result_find_pid = mysql_db_query($db, $sql_pid, $connection) or die("SQL
pid fejl");
$row_pid = mysql_fetch_array($result_find_pid);
$id = $row_pid["Id"];
print($id);
I og med to brugere køre med samme id vil noget kunne gå galt da
mysql_insert_id() så binder sig oppe af dette id. Dette er som sagt kun en
formodning og vil måske kun ske hvis en masse quries bliver kørt lige på
samme tid.
Ved mysql_connect er problemet der i al fald ikke da der altid bruges et nyt
pid for hver gang man connecter.
/ morten
| |
Christian Schmidt (16-04-2001)
| Kommentar Fra : Christian Schmidt |
Dato : 16-04-01 12:55 |
|
Morten Winther wrote:
>
> Det vil sige at hvis jeg kalder mysql_insert_id() kan du jo tage id'et der
> hører til en anden burger.
>
> Hvis man burger mysql_pconnect vil 2 brugere få same id gennem følgende:
>
> $sql_pid ="SHOW PROCESSLIST";
> $result_find_pid = mysql_db_query($db, $sql_pid, $connection) or die("SQL
> pid fejl");
> $row_pid = mysql_fetch_array($result_find_pid);
> $id = $row_pid["Id"];
> print($id);
>
> I og med to brugere køre med samme id vil noget kunne gå galt da
> mysql_insert_id() så binder sig oppe af dette id. Dette er som sagt kun en
> formodning og vil måske kun ske hvis en masse quries bliver kørt lige på
> samme tid.
Jeg forstår ikke, hvor du vil hen med ovenstående. Med mysql_insert_id()
behøver du ikke bekymre dig om PID eller lignende.
Når du kalder mysql_pconnect(), så reserverer PHP en MySQL-forbindelse
til dig (muligvis en nyåbnet forbindelse, men som regel en "brugt"
forbindelse hentet fra en "bunke"). Denne forbindelse har dit script
eneret på, indtil scriptet terminerer. Det vil sige, at hvis du laver en
INSERT vha. mysql_query(), og du derefter bruger mysql_insert_id(), da
vil mysql_insert_id() finde det senest indsatte id for den aktuelle
forbindelse. Og da denne forbindelse ikke er blevet brugt af andre siden
dit kald til mysql_pconnect(), da vil du få det ønskede id ud.
Når dit script terminerer, vil MySQL-forbindelsen blive lagt tilbage i
bunken, og først der kan den bruges af andre.
Alt i alt tror jeg, at medmindre du har nogle meget mærkværdige behov,
så skal du tro på PHP-dokumentationen, der siger, at det ikke kan betale
sig ikke at bruge persistent connections.
Christian
| |
Morten Winther (16-04-2001)
| Kommentar Fra : Morten Winther |
Dato : 16-04-01 15:40 |
|
"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3ADADD7B.EAB57AFD@schmidt.net...
> Jeg forstår ikke, hvor du vil hen med ovenstående. Med mysql_insert_id()
> behøver du ikke bekymre dig om PID eller lignende.
>
> Når du kalder mysql_pconnect(), så reserverer PHP en MySQL-forbindelse
> til dig (muligvis en nyåbnet forbindelse, men som regel en "brugt"
> forbindelse hentet fra en "bunke"). Denne forbindelse har dit script
> eneret på, indtil scriptet terminerer. Det vil sige, at hvis du laver en
> INSERT vha. mysql_query(), og du derefter bruger mysql_insert_id(), da
> vil mysql_insert_id() finde det senest indsatte id for den aktuelle
> forbindelse. Og da denne forbindelse ikke er blevet brugt af andre siden
> dit kald til mysql_pconnect(), da vil du få det ønskede id ud.
>
> Når dit script terminerer, vil MySQL-forbindelsen blive lagt tilbage i
> bunken, og først der kan den bruges af andre.
>
> Alt i alt tror jeg, at medmindre du har nogle meget mærkværdige behov,
> så skal du tro på PHP-dokumentationen, der siger, at det ikke kan betale
> sig ikke at bruge persistent connections.
Ok, tak for svaret. Jeg prøver og ser om det virker efter hensigten.
/ morten
| |
|
|