phpbar.de logo

Mailinglisten-Archive

Re: auto_increment reorganisieren ?
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: auto_increment reorganisieren ?



Thomas Gericke schrieb am Freitag, den 16. Juli 1999:
> [...] man möchte das Ganze nun aber reorganisieren, daß er die
> Datensätze nochmal neu von 1 bis 501 durchnummeriert und dort dann
> weiter macht.
> 
> Wie geht das?

Neben dem von Amalesh beschriebenen Ansatz ist die einfachste Lösung
wahrscheinlich, die Umnumerierung in der Programmiersprache Deiner
DB-Anwendung (sei's jetzt PHP, Perl, C++, ...) durchzuführen.
Pseudocode:
    $old[] := SELECT aifeld FROM tabelle ORDER BY aifeld
    for $new:=1 to size($old[]) {
      UPDATE tabelle SET aifeld=$new WHERE aifeld=$old[$new]
    }
       
Ich habe hier anschließend zwar noch eine nette SQL-Anfrage, die diese
Umnumerierung unterstützt, aber direkt per Programmschleife geht's
sicher doch am schnellsten!


Beispieldaten:
  CREATE TABLE autoinc (
    i int(11) DEFAULT '0' NOT NULL auto_increment,
    x char(10),
    KEY i (i)
  );
  INSERT INTO autoinc VALUES
   (1,'0.8110')
  ,(4,'0.5139')
  ,(3,'0.1363')
  ,(20,'0.1399')
  ,(21,'errr')
  ,(2,'sdfs')
  ,(5,'abcd')
  ,(30,'0.0215');

Mein Gedanke ist, daß man eine fortlaufende Numerierung wieder durch
einen Gruppierungstrick errechnen kann:

  SELECT   SUM(a1.i>=a2.i) AS n, a1.i, a1.x
  FROM     autoinc AS a1, autoinc AS a2
  GROUP BY a1.i;
ergibt:
  +---+----+--------+
  | n | i  | x      |
  +---+----+--------+
  | 1 |  1 | 0.8110 |
  | 2 |  2 | sdfs   |
  | 3 |  3 | 0.1363 |
  | 4 |  4 | 0.5139 |
  | 5 |  5 | abcd   |
  | 6 | 20 | 0.1399 |
  | 7 | 21 | errr   |
  | 8 | 30 | 0.0215 |
  +---+----+--------+

Leider habe ich es nicht geschafft, dieses so errechnete n irgendwie
für ein direktes UPDATE zu nutzen.

Aber man kann das Ergebnis obiger Anfrage leicht für die nötigen
UPDATES nutzen - wenn man will, sogar recht direkt. :-)
  SELECT CONCAT('UPDATE autoinc SET i=',SUM(a1.i>=a2.i)
               ,' WHERE i=',a1.i,';') AS Updates
  FROM     autoinc AS a1, autoinc AS a2
  GROUP BY a1.i;
ergibt:
  +------------------------------------+
  | Updates                            |
  +------------------------------------+
  | UPDATE autoinc SET i=1 WHERE i=1;  |
  | UPDATE autoinc SET i=2 WHERE i=2;  |
  | UPDATE autoinc SET i=3 WHERE i=3;  |
  | UPDATE autoinc SET i=4 WHERE i=4;  |
  | UPDATE autoinc SET i=5 WHERE i=5;  |
  | UPDATE autoinc SET i=6 WHERE i=20; |
  | UPDATE autoinc SET i=7 WHERE i=21; |
  | UPDATE autoinc SET i=8 WHERE i=30; |
  +------------------------------------+

Aber wie oben erwähnt, ist das wirklich mehr ein Gedankenspiel, was
geht, denn ein sillvoller Vorschlag ... ;-)

Ciao,
  Martin
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ >
PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive