遅い - MySQLで数値の範囲を生成する




sql ランダム 数値 (6)

どのように私はテーブルにそれらを挿入することができるようにMySQLのクエリから連続した数字の範囲(1行に1つ)を生成するのですか?

例えば:

nr
1
2
3
4
5

私はこのためにMySQLだけを使用したいと思います(PHPや他の言語ではありません)。


あなたのテーブルに1から100までの数字を挿入したいとしましょう。 あなたが少なくともそれほど多くの行を持つ他のテーブルを持っている限り(テーブルの内容とは関係ありません)、これが私の推奨する方法です:

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

1以外のもので始まる範囲が必要ですか? @ROWが結合に設定されているものを変更するだけです。


これはループなしでセットベースで行う1つの方法です。 これは、再使用のためのビューにすることもできます。 この例では、0から999までのシーケンスの生成を示していますが、もちろんそれに合わせて変更することができます。

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

ハードウェアエンジニアのshareのバージョンは次のとおりです。

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;

皆さんが分かっているように、これはむしろハッキーなので気をつけて使用してください

SELECT id % 12 + 1 as one_to_twelve FROM any_large_table group by one_to_twelve

私が知っている(最短の)方法は、長いシーケンスを持つテーブルを作成することです(それを自分自身で既存のテーブルに結合することです)。 任意の(共通の)MySQLサーバにはinformation_schema.COLUMNSテーブルがあるので、私はそれを使用します:

DROP TABLE IF EXISTS seq;
CREATE TABLE seq (i MEDIUMINT AUTO_INCREMENT PRIMARY KEY)
    SELECT NULL AS i
    FROM information_schema.COLUMNS t1
    JOIN information_schema.COLUMNS t2
    JOIN information_schema.COLUMNS t3
    LIMIT 100000; -- <- set your limit here

通常、1つの結合で1M行以上の作成が可能ですが、もう1つの結合で害を受けることはありません:-) - 制限を設定することを忘れないでください。

0を含める場合は、 AUTO_INCEMENTプロパティを "削除"する必要があります。

ALTER TABLE seq ALTER i DROP DEFAULT;
ALTER TABLE seq MODIFY i MEDIUMINT;

これで0を挿入でき0

INSERT INTO seq (i) VALUES (0);

負の数も同様に

INSERT INTO seq (i) SELECT -i FROM seq WHERE i <> 0;

あなたはで番号を検証することができます

SELECT MIN(i), MAX(i), COUNT(*) FROM seq;

DECLARE i INT DEFAULT 0;

WHILE i < 6 DO
  /* insert into table... */
  SET i = i + 1;
END WHILE;




mysql