68 Stimmen

Generierung eines Zahlenbereichs in MySQL

Wie generiere ich einen Bereich von aufeinanderfolgenden Zahlen (eine pro Zeile) aus einer MySQL-Abfrage, so dass ich sie in eine Tabelle einfügen kann?

Zum Beispiel:

nr
1
2
3
4
5

Ich möchte dafür nur MySQL verwenden (nicht PHP oder andere Sprachen).

0 Stimmen

Möchten Sie dies zu bestehenden Datensätzen oder zu einer völlig neuen Tabelle hinzufügen?

1 Stimmen

Warum können Sie keine auto_increment-Spalte verwenden?

74voto

Pittsburgh DBA Punkte 6492

Hier ist eine Möglichkeit, dies ohne Schleifen zu tun. Dies kann auch in eine Ansicht zur Wiederverwendung umgewandelt werden. Das Beispiel zeigt die Generierung einer Sequenz von 0 bis 999, aber natürlich kann es entsprechend angepasst werden.

INSERT INTO
    myTable
    (
    nr
    )
SELECT
    SEQ.SeqValue
FROM
(
SELECT
    (HUNDREDS.SeqValue + TENS.SeqValue + ONES.SeqValue) SeqValue
FROM
    (
    SELECT 0  SeqValue
    UNION ALL
    SELECT 1 SeqValue
    UNION ALL
    SELECT 2 SeqValue
    UNION ALL
    SELECT 3 SeqValue
    UNION ALL
    SELECT 4 SeqValue
    UNION ALL
    SELECT 5 SeqValue
    UNION ALL
    SELECT 6 SeqValue
    UNION ALL
    SELECT 7 SeqValue
    UNION ALL
    SELECT 8 SeqValue
    UNION ALL
    SELECT 9 SeqValue
    ) ONES
CROSS JOIN
    (
    SELECT 0 SeqValue
    UNION ALL
    SELECT 10 SeqValue
    UNION ALL
    SELECT 20 SeqValue
    UNION ALL
    SELECT 30 SeqValue
    UNION ALL
    SELECT 40 SeqValue
    UNION ALL
    SELECT 50 SeqValue
    UNION ALL
    SELECT 60 SeqValue
    UNION ALL
    SELECT 70 SeqValue
    UNION ALL
    SELECT 80 SeqValue
    UNION ALL
    SELECT 90 SeqValue
    ) TENS
CROSS JOIN
    (
    SELECT 0 SeqValue
    UNION ALL
    SELECT 100 SeqValue
    UNION ALL
    SELECT 200 SeqValue
    UNION ALL
    SELECT 300 SeqValue
    UNION ALL
    SELECT 400 SeqValue
    UNION ALL
    SELECT 500 SeqValue
    UNION ALL
    SELECT 600 SeqValue
    UNION ALL
    SELECT 700 SeqValue
    UNION ALL
    SELECT 800 SeqValue
    UNION ALL
    SELECT 900 SeqValue
    ) HUNDREDS
) SEQ

57voto

David Ehrmann Punkte 7006

Hier ist die Version eines Hardware-Ingenieurs von Die Lösung von Pittsburgh DBA :

SELECT
    (TWO_1.SeqValue + TWO_2.SeqValue + TWO_4.SeqValue + TWO_8.SeqValue + TWO_16.SeqValue) SeqValue
FROM
    (SELECT 0 SeqValue UNION ALL SELECT 1 SeqValue) TWO_1
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 2 SeqValue) TWO_2
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 4 SeqValue) TWO_4
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 8 SeqValue) TWO_8
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 16 SeqValue) TWO_16;

39voto

Sklivvz Punkte 29602

Wenn Sie die Datensätze in einer Tabelle benötigen und Gleichzeitigkeitsprobleme vermeiden wollen, gehen Sie folgendermaßen vor.

Zuerst erstellen Sie eine Tabelle, in der Sie Ihre Datensätze speichern

CREATE TABLE `incr` (
  `Id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Zweitens erstellen Sie eine gespeicherte Prozedur wie diese:

DELIMITER ;;
CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;
  WHILE v1 > 0 DO
    INSERT incr VALUES (NULL);
    SET v1 = v1 - 1;
  END WHILE;
END;;
DELIMITER ;

Rufen Sie abschließend die SP an:

CALL dowhile();
SELECT * FROM incr;

Ergebnis

Id
1
2
3
4
5

26voto

JaredC Punkte 1350

Angenommen, Sie möchten die Zahlen 1 bis 100 in Ihre Tabelle einfügen. Solange Sie eine andere Tabelle haben, die mindestens so viele Zeilen hat (der Inhalt der Tabelle spielt keine Rolle), ist dies meine bevorzugte Methode:

INSERT INTO pivot100 
SELECT @ROW := @ROW + 1 AS ROW
 FROM someOtherTable t
 join (SELECT @ROW := 0) t2
 LIMIT 100
;

Sie möchten einen Bereich, der mit einer anderen Zahl als 1 beginnt? Ändern Sie einfach den Wert, auf den @ROW bei der Verknüpfung gesetzt wird.

7voto

Jakob Eriksson Punkte 18274

Wie ihr alle wisst, ist das ziemlich hakelig, also mit Vorsicht zu genießen

SELECT
  id % 12 + 1 as one_to_twelve
FROM
  any_large_table
GROUP BY
  one_to_twelve
;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X