auto_increment = 0 startet immer bei 1

auto_increment = 0 startet immer bei 1

am 06.02.2007 11:05:06 von Karsten Wutzke

Hallo alle!

Ich probier nun schon seit einiger Zeit, dass die Datensätze unten
sowie das autoincrement statement

ALTER TABLE `state` AUTO_INCREMENT =3D 0;

INSERT INTO `state` VALUES (0, 81, 'Unbekannt', 'XX');
INSERT INTO `state` VALUES (NULL, 81, 'Baden-Württemberg', 'BW');
INSERT INTO `state` VALUES (NULL, 81, 'Bayern', 'BY');
INSERT INTO `state` VALUES (NULL, 81, 'Berlin', 'BE');
...
INSERT INTO `state` VALUES (NULL, 81, 'Thüringen', 'TH');

so durchlaufen, dass der erste Eintrag 'Unbekannt' anfängt.

Tabelle 'state' hat:
state_id int (mit auto_increment)
country_id int
name varchar(64)
iso2 varchar(2)

Ich möchte gern wissen warum MySQL immer bei 1 anfängt.

Ein
ALTER TABLE `state` AUTO_INCREMENT =3D -1;
führt immer zu einem Fehler.

Auch das Benutzen von phpMyAdmin oder dem MySQL Query Browser ergibt
keinen Unterschied.

Vielleicht kann mir auch jemand erklären warum das so ist?? Ich dachte
mir, wenn ich den DEFAULT der AUTO_INCREMENT-Spalte auf 0 setze, dann
taucht immer der Eintrag 'Unbekannt' auf.

Wär schön wenn mir jemand das mal erklären könnte, wirklich logisch
find ich das nicht.

Danke und Gruß
Karsten

Re: auto_increment = 0 startet immer bei 1

am 06.02.2007 12:41:29 von Helmut Chang

Karsten Wutzke schrieb:

> ALTER TABLE `state` AUTO_INCREMENT = 0;
>
> INSERT INTO `state` VALUES (0, 81, 'Unbekannt', 'XX');
....
> Ich möchte gern wissen warum MySQL immer bei 1 anfängt.

Weil das AFAIK so ist: der niedrigste mögliche Wert in einer
auto_increment-Spalte ist 1. Ich finde aber explizit im Manual auch grad
nichts dazu. Außer:



| auto_increment_increment and auto_increment_offset are intended for
| use with master-to-master replication, and can be used to control the
| operation of AUTO_INCREMENT columns. Both variables can be set
| globally or locally, and each can assume an integer value between 1
| and 65,535 inclusive. Setting the value of either of these two
| variables to 0 causes its value to be set to 1 instead.

gruss, heli

Re: auto_increment = 0 startet immer bei 1

am 06.02.2007 14:17:20 von Axel Schwenke

"Karsten Wutzke" wrote:
>
> Ich probier nun schon seit einiger Zeit, dass die Datensätze unten
> sowie das autoincrement statement
>
> ALTER TABLE `state` AUTO_INCREMENT = 0;

Geht nicht.

> INSERT INTO `state` VALUES (0, 81, 'Unbekannt', 'XX');
> INSERT INTO `state` VALUES (NULL, 81, 'Baden-Württemberg', 'BW');
> INSERT INTO `state` VALUES (NULL, 81, 'Bayern', 'BY');
> INSERT INTO `state` VALUES (NULL, 81, 'Berlin', 'BE');
> ...
> INSERT INTO `state` VALUES (NULL, 81, 'Thüringen', 'TH');
>
> so durchlaufen, dass der erste Eintrag 'Unbekannt' anfängt.
>
> Tabelle 'state' hat:
> state_id int (mit auto_increment)
> country_id int
> name varchar(64)
> iso2 varchar(2)
>
> Ich möchte gern wissen warum MySQL immer bei 1 anfängt.

Weil 0 ein spezieller Wert ist. Bis MySQL 5.0 konntest du wahlweise 0
oder NULL verwenden, um dir einen AUTO_INCREMENT Wert generieren zu
lassen. Ab 5.0 kannst du das Verhalten bei 0 konfigurieren:

http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

"NO_AUTO_VALUE_ON_ZERO affects handling of AUTO_INCREMENT columns.
Normally, you generate the next sequence number for the column by
inserting either NULL or 0 into it. NO_AUTO_VALUE_ON_ZERO suppresses
this behavior for 0 so that only NULL generates the next sequence
number."


> Vielleicht kann mir auch jemand erklären warum das so ist?? Ich dachte
> mir, wenn ich den DEFAULT der AUTO_INCREMENT-Spalte auf 0 setze, dann
> taucht immer der Eintrag 'Unbekannt' auf.

Das geht auch nicht. Eine AUTO_INCREMENT Spalte hat immer DEFAULT NULL
= eine neue generierte Nummer. Das ist deswegen so, weil AUTO_INCREMENT
immer auch PRIMARY KEY bedeutet. Ein etwaiger statischer DEFAULT Wert
würde also nur einmal funktionieren.


XL

Re: auto_increment = 0 startet immer bei 1

am 06.02.2007 15:08:33 von Karsten Wutzke

On 6 Feb., 14:17, Axel Schwenke wrote:
> "Karsten Wutzke" wrote:
>
> > Ich probier nun schon seit einiger Zeit, dass die Datensätze unten
> > sowie das autoincrement statement
>
snip
>
> http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
>
> "NO_AUTO_VALUE_ON_ZERO affects handling of AUTO_INCREMENT columns.
> Normally, you generate the next sequence number for the column by
> inserting either NULL or 0 into it. NO_AUTO_VALUE_ON_ZERO suppresses
> this behavior for 0 so that only NULL generates the next sequence
> number."
>
snip
>
> XL

Hi danke für diese Hilfe!

Mir reicht in Prinzip schon der Absatz danach, vor allem der Satz
"(Storing 0 is not a recommended practice, by the way.)".

Gruß
Karsten

Re: auto_increment = 0 startet immer bei 1

am 07.02.2007 10:26:50 von Thomas Rachel

Karsten Wutzke wrote:

> so durchlaufen, dass der erste Eintrag 'Unbekannt' anfängt.

Der erste Eintrag kann ja auch mit 1 numeriert sein.

Alternativ könntest Du in der referenzierenden Tabelle NULL für "unbekannt"
schreiben und mit einem LEFT JOIN sowie mit
COALESCE(state.name,'Unbekannt') arbeiten.


Thomas
--
Dem Vogel ist ein einfacher Zweig lieber als ein goldener Käfig. (Aus
Rußland)