Discussion:
Was, wenn auto_increment das ende erreicht?
(zu alt für eine Antwort)
Martin Kaffanke
vor 19 Jahren
Permalink
Hallo!


Ein INT geht von -2147483648 bis -2147483647, ein UNSIGNED BIGINT von 0
bis 18446744073709551615

Was passiert wenn ich einen Primary Key mit auto increment definiere und
diese Zahlen erreicht werden?

lg,
Martin
Claus Reibenstein
vor 19 Jahren
Permalink
Post by Martin Kaffanke
Ein INT geht von -2147483648 bis -2147483647, ein UNSIGNED BIGINT von 0
bis 18446744073709551615
Was passiert wenn ich einen Primary Key mit auto increment definiere und
diese Zahlen erreicht werden?
Nehmen wir einmal an, Du hast einen ultraflinken Server und eine
Software, die es gemeinsam schaffen, jede Millisekunde einen neuen
Datensatz anzulegen. Bei INT (welches übrigens bis +2147483647 geht)
würde der von Dir prognostizierte Fall also schon nach 2147483 Sekunden
eintreten, also nach rund 68 Jahren. Warum also jetzt schon Sorgen machen?

Für UNSIGNED BIGINT spare ich mir diese Betrachtung, weil ich davon
ausgehe, dass die Menschheit diesen Fall nicht mehr erleben wird.

Gruß. Claus
Guido Schmidt
vor 19 Jahren
Permalink
Post by Claus Reibenstein
Nehmen wir einmal an, Du hast einen ultraflinken Server und eine
Software, die es gemeinsam schaffen, jede Millisekunde einen neuen
Datensatz anzulegen. Bei INT (welches übrigens bis +2147483647 geht)
würde der von Dir prognostizierte Fall also schon nach 2147483 Sekunden
eintreten, also nach rund 68 Jahren.
2147483 Sekunden sind gerade mal knapp 25 Tage. Vielleicht sollte er
sich doch Sorgen machen :)

68 Jahre ergeben sich bei einem neuen Datensatz pro Sekunde und nicht
pro Millisekunde.

Guido
Claus Reibenstein
vor 19 Jahren
Permalink
Post by Guido Schmidt
Post by Claus Reibenstein
würde der von Dir prognostizierte Fall also schon nach 2147483 Sekunden
eintreten, also nach rund 68 Jahren.
2147483 Sekunden sind gerade mal knapp 25 Tage. Vielleicht sollte er
sich doch Sorgen machen :)
68 Jahre ergeben sich bei einem neuen Datensatz pro Sekunde und nicht
pro Millisekunde.
Stimmt. Hier lag mein Rechenfehler.

Ich habe in der Zwischenzeit mal versucht, über Google irgendetwas zu
diesem Thema rauszufinden. Leider komplette Fehlanzeige. Offenbar hat
sich bislang noch nie jemand Sorgen zu diesem Thema gemacht.

Gruß. Claus
Andreas Kretschmer
vor 19 Jahren
Permalink
Post by Claus Reibenstein
Ich habe in der Zwischenzeit mal versucht, über Google irgendetwas zu
diesem Thema rauszufinden. Leider komplette Fehlanzeige. Offenbar hat
sich bislang noch nie jemand Sorgen zu diesem Thema gemacht.
Ich weiß nicht, wie und wo MySQL Sequencen verwaltet, unter PostgreSQL
gibt es extra Sequence-Objekte dafür, die folgendes enthalten:

test=> \d s1
Sequence "public.s1"
Column | Type
---------------+---------
sequence_name | name
last_value | bigint
increment_by | bigint
max_value | bigint
min_value | bigint
cache_value | bigint
log_cnt | bigint
is_cycled | boolean
is_called | boolean


Hier kann man im übrigen auch einstellen, was bei einem Überlauf
passiert. Vielleicht hilft Euch das bei Eurer Forschungsarbeit ja
weiter.


end
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Norbert Melzer
vor 19 Jahren
Permalink
Bei INT (welches übrigens bis +2147483647 geht) würde der von Dir
prognostizierte Fall also schon nach 2147483 Sekunden eintreten, also
nach rund 68 Jahren. Warum also jetzt schon Sorgen machen?
Mal von Deinem Rechenfehler abgesehen, immerhin wurdest Du schon darauf
gestoßen, ist das IMHO die Falsche Einstellung, denn die letzten
AUswirkung solchen Gedankengutes waren vor ungefähr 7 Jahren deutlich zu
spüren (auch wenn es da zum großteil Gottseidank Panikmache war)

MfG
Norbert
n.Olivier
vor 19 Jahren
Permalink
Hi
Post by Norbert Melzer
Bei INT (welches übrigens bis +2147483647 geht) würde der von Dir
prognostizierte Fall also schon nach 2147483 Sekunden eintreten, also
nach rund 68 Jahren. Warum also jetzt schon Sorgen machen?
Mal von Deinem Rechenfehler abgesehen, immerhin wurdest Du schon darauf
gestoßen, ist das IMHO die Falsche Einstellung, denn die letzten
AUswirkung solchen Gedankengutes waren vor ungefähr 7 Jahren deutlich zu
spüren (auch wenn es da zum großteil Gottseidank Panikmache war)
:-)))

allerdings bei bigint sollte er selbst bei 1 Mrd. DS/Sec.
seine Sorgen nicht mehr erleben :-)))

Nun gut, man könnte da jetzt Kryonic einwerfen ...

gruß n.Olivier
--
Nachbagauer Olivier - www.nOlivier.com
www.reedb.com - Immobilien national & international
Webportal der Immobilien-Branche - www.Immofinder.de
Weinzierl Stefan
vor 19 Jahren
Permalink
Post by Martin Kaffanke
Hallo!
Ein INT geht von -2147483648 bis -2147483647, ein UNSIGNED BIGINT von 0
bis 18446744073709551615
Was passiert wenn ich einen Primary Key mit auto increment definiere und
diese Zahlen erreicht werden?
CREATE TABLE test(id TINYINT AUTO_INCREMENT PRIMARY KEY);

128x INSERT INTO test(id) VALUES(NULL);

ERROR 1062 (23000): Duplicate entry '127' for key 1


Stefan
Dominik Echterbruch
vor 19 Jahren
Permalink
Weinzierl Stefan wrote:

[Überlauf von auto_increment]
Post by Weinzierl Stefan
CREATE TABLE test(id TINYINT AUTO_INCREMENT PRIMARY KEY);
128x INSERT INTO test(id) VALUES(NULL);
ERROR 1062 (23000): Duplicate entry '127' for key 1
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".


Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - Das Portal für virtuelle Kerzen
Andreas Kretschmer
vor 19 Jahren
Permalink
Post by Dominik Echterbruch
Post by Weinzierl Stefan
128x INSERT INTO test(id) VALUES(NULL);
ERROR 1062 (23000): Duplicate entry '127' for key 1
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".
Yeah. Die Fehlermeldungen von MySQL werden sinnvoller. Aber so richtig
sinnvoll sind sie noch nicht...

test=# create table voll (id bigserial, val text);
NOTICE: CREATE TABLE will create implicit sequence "voll_id_seq" for serial column "voll.id"
CREATE TABLE
test=# select setval('voll_id_seq', 9223372036854775804);
setval
---------------------
9223372036854775804
(1 row)

test=# insert into voll (id) values (nextval('voll_id_seq'));
INSERT 0 1
test=# insert into voll (id) values (nextval('voll_id_seq'));
INSERT 0 1
test=# insert into voll (id) values (nextval('voll_id_seq'));
INSERT 0 1
test=# insert into voll (id) values (nextval('voll_id_seq'));
ERROR: nextval: reached maximum value of sequence "voll_id_seq" (9223372036854775807)
test=#



end
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Andreas Kretschmer
vor 19 Jahren
Permalink
Post by Andreas Kretschmer
Post by Dominik Echterbruch
Post by Weinzierl Stefan
128x INSERT INTO test(id) VALUES(NULL);
ERROR 1062 (23000): Duplicate entry '127' for key 1
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".
Yeah. Die Fehlermeldungen von MySQL werden sinnvoller. Aber so richtig
sinnvoll sind sie noch nicht...
Um zu erklären, was ich meine:

,----[ Sequence ohne CYCLE ]
| test=# create table voll (id bigserial, val text);
| NOTICE: CREATE TABLE will create implicit sequence "voll_id_seq" for serial column "voll.id"
| CREATE TABLE
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| INSERT 0 1
| test=# select setval('voll_id_seq', 9223372036854775806);
| setval
| ---------------------
| 9223372036854775806
| (1 row)
|
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| INSERT 0 1
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| ERROR: nextval: reached maximum value of sequence "voll_id_seq" (9223372036854775807)
`----


,----[ Sequence mit CYCLE gesetzt ]
| test=# create table voll (id bigserial primary key, val text);
| NOTICE: CREATE TABLE will create implicit sequence "voll_id_seq" for serial column "voll.id"
| NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "voll_pkey" for table "voll"
| CREATE TABLE
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| INSERT 0 1
| test=# select setval('voll_id_seq', 9223372036854775806);
| setval
| ---------------------
| 9223372036854775806
| (1 row)
|
| test=# alter SEQUENCE voll_id_seq CYCLE;
| ALTER SEQUENCE
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| INSERT 0 1
| test=# insert into voll (id) values (nextval('voll_id_seq'));
| ERROR: duplicate key violates unique constraint "voll_pkey"
| test=#
`----

Offensichtlich macht MySQL von sich aus ein CYCLE, und merkt erst dann,
daß da schon was ist. Womit die Frage des Fragestellers wohl beantwortet
wäre.
Post by Andreas Kretschmer
end
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
end
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Johannes Vogel
vor 19 Jahren
Permalink
Hi Andreas
...
Nein, MySQL reduziert den errechneten Wert > 127 auf 127 und versucht
einen solchen Eintrag anzulegen. Das jedoch gelingt nicht, weil ein
solcher bereits vorhanden ist. Deshalb ist auch die Fehlermeldung völlig
in Ordnung. Schade nur, dass die Warning nicht offensichtlicher zum
Ausdruck kommt.

------------------------------8<----------------------------------------
mysql> create table test (id tinyint primary key auto_increment);
Query OK, 0 rows affected (0.10 sec)

mysql> alter table test auto_increment=127;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> insert into test values (null);
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (null);
ERROR 1062 (23000): Duplicate entry '127' for key 1
mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------+
| Warning | 1264 |Data truncated; out of range for column 'id' at row 1|
| Error | 1062 |Duplicate entry '127' for key 1 |
+---------+------+-----------------------------------------------------+
2 rows in set (0.01 sec)
------------------------------8<----------------------------------------

HTH, Johannes
Kristian Köhntopp
vor 19 Jahren
Permalink
Post by Dominik Echterbruch
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".
Das verwechselst Du. Die Fehlermeldung "table full" bekommst Du, wenn Deine
Tabelle zu gross wird, um noch mit dem durch MAX_ROWS und AVG_ROW_SIZE
definierten Row Pointer adressierbar zu sein.

Kris
Dominik Echterbruch
vor 19 Jahren
Permalink
Post by Kristian Köhntopp
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".
Das verwechselst Du. Die Fehlermeldung "table full" bekommst Du, wenn Deine
Tabelle zu gross wird, um noch mit dem durch MAX_ROWS und AVG_ROW_SIZE
definierten Row Pointer adressierbar zu sein.
Hmm... Ich war mir bei dieser Aussage absolut sicher und habe deswegen
mal Google konsultiert. Und tatsächlich habe ich einen Beitrag gefunden,
in dem dieses Phänomen mit der o.g. Meldung dokumentiert wurde.
Dummerweise stammte dieser Beitrag von mir und war eine Antwort auf eine
entsprechende Frage. Also blöderweise kein belastbarer Beweis :)

Aber ich bin mir nach wie vor sehr sicher, daß vor einigen Jahren öfter
mal diese Frage gestelt wurde. Und dann immer im zusammenhang mit
"tinyint" und "Table full". Die Idee für meine damalige Antwort kam ja
nicht von ungefähr... Leider konnte ich es auch auf meiner angestaubten
3.23 nicht mehr nachvollziehen. Auch dort kommt der "Duplicate key".
Vielleicht war es in in 3.22 mit den ISAM Tabellen so.


Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - das Portal für virtuelle Kerzen
Dominik Echterbruch
vor 19 Jahren
Permalink
Post by Kristian Köhntopp
Das ist interessant. Früher lautete die Fehlermeldung mal "Table full".
Das verwechselst Du. Die Fehlermeldung "table full" bekommst Du, wenn Deine
Tabelle zu gross wird, um noch mit dem durch MAX_ROWS und AVG_ROW_SIZE
definierten Row Pointer adressierbar zu sein.
Hmm... Ich war mir bei dieser Aussage absolut sicher und habe deswegen
mal Google konsultiert. Und tatsächlich habe ich einen Beitrag gefunden,
in dem dieses Phänomen mit der o.g. Meldung dokumentiert wurde.
Dummerweise stammte dieser Beitrag von mir und war eine Antwort auf eine
entsprechende Frage. Also blöderweise kein belastbarer Beweis :)


Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - das Portal für virtuelle Kerzen
Loading...