복붙노트

[SQL] MySQL의에서 숫자의 범위를 생성

SQL

MySQL의에서 숫자의 범위를 생성

나는 테이블에 삽입 할 수 있도록 어떻게 MySQL의 쿼리에서 연속 번호 (한 줄에 하나)의 범위를 생성합니까?

예를 들면 :

nr
1
2
3
4
5

나는이 (안 PHP 또는 다른 언어) 만 MySQL을 사용하고 싶습니다.

해결법

  1. ==============================

    1.당신이 테이블의 레코드를 필요로하고 동시성 문제를 방지하려면, 여기를 수행하는 방법이다.

    당신이 테이블의 레코드를 필요로하고 동시성 문제를 방지하려면, 여기를 수행하는 방법이다.

    첫째로 당신은 당신의 기록을 저장할 테이블을 생성

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

    두 번째로이 같은 저장 프로 시저를 만들 :

    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 ;
    

    마지막으로 SP를 호출

    CALL dowhile();
    SELECT * FROM incr;
    

    결과

    Id
    1
    2
    3
    4
    5
    
  2. ==============================

    2.여기가 루프없이 기반 설정하는 하나의 방법이다. 이것은 또한 다시 사용할 수있는보기로 만들 수 있습니다. 예는 0 내지 999에서 서열의 발생을 나타내지 만, 물론, 이는 적합하도록 변형 될 수있다.

    여기가 루프없이 기반 설정하는 하나의 방법이다. 이것은 또한 다시 사용할 수있는보기로 만들 수 있습니다. 예는 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
    
  3. ==============================

    3.여기 피츠버그 DBA의 솔루션의 하드웨어 엔지니어의 버전입니다 :

    여기 피츠버그 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;
    
  4. ==============================

    4.하자 당신이 당신의 테이블에 (100)를 통해 숫자 1을 삽입하고 싶은 말은. 만큼 당신이 다른 테이블을 가지고 적어도 그 많은 행 (테이블의 내용을 중요하지 않습니다), 다음이 내 선호하는 방법입니다 :

    하자 당신이 당신의 테이블에 (100)를 통해 숫자 1을 삽입하고 싶은 말은. 만큼 당신이 다른 테이블을 가지고 적어도 그 많은 행 (테이블의 내용을 중요하지 않습니다), 다음이 내 선호하는 방법입니다 :

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

    1 이외의 시작 범위를 원하십니까? 그냥 @ROW이 조인에 설정됩니다 무엇을 변경합니다.

  5. ==============================

    5.

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

    6.모두가 알고있는 것처럼,이주의 오히려 해키 때문에 사용을하다

    모두가 알고있는 것처럼,이주의 오히려 해키 때문에 사용을하다

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

    7.긴 순서로 테이블을 만들 수 (MySQL은) 내가 알고있는 "짧은"방법은 (크로스) 자신과 기존 테이블에 가입하는 것입니다. 어떤 (공통) MySQL 서버가 INFORMATION_SCHEMA.COLUMNS 테이블을 가지고 있기 때문에 나는 그것을 사용합니다 :

    긴 순서로 테이블을 만들 수 (MySQL은) 내가 알고있는 "짧은"방법은 (크로스) 자신과 기존 테이블에 가입하는 것입니다. 어떤 (공통) 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
    

    보통 사람은 100 만 행을 통해 만들 충분해야 가입 - 그러나 하나 더 :-) 해치지 않을 것입니다 가입 - 그냥이 제한을 설정하는 것을 잊지 마세요.

    0을 포함 할 경우, AUTO_INCEMENT 속성을 "제거"해야한다.

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

    지금 당신은 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;
    
  8. ==============================

    8.아주 수락 응답과 유사하지만, MySQL을위한 구문으로 새를 사용하여> = 훨씬 더 읽기 쉽게하고 의도는 명확 8.0

    아주 수락 응답과 유사하지만, MySQL을위한 구문으로 새를 사용하여> = 훨씬 더 읽기 쉽게하고 의도는 명확 8.0

    WITH DIGITS (N) AS (
      SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
      SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
      SELECT 8 UNION ALL SELECT 9)
    SELECT 
      UNITS.N + TENS.N*10 + HUNDREDS.N*100 + THOUSANDS.N*1000 
    FROM 
      DIGITS AS UNITS, DIGITS AS TENS, DIGITS AS HUNDREDS, DIGITS AS THOUSANDS;
    
  9. ==============================

    9.내가 공유 할 생각은 질문에 대한 정확한 응답하지 않습니다하지만 난 그것을 공유하고 싶습니다 그래서 일부 유용 할 수 있습니다.

    내가 공유 할 생각은 질문에 대한 정확한 응답하지 않습니다하지만 난 그것을 공유하고 싶습니다 그래서 일부 유용 할 수 있습니다.

    자주 숫자의 제한된 필요한 경우 당신이 필요로하는 바로 그 테이블마다 시간을 사용할 수있는 숫자 테이블을 만들 도움이 될 수 있습니다. 예를 들면 :

    CREATE TABLE _numbers (num int);
    INSERT _numbers VALUES (0), (1), (2), (3), ...;
    

    당신이 특정 합리적인 한계 이하 숫자를해야하는 경우에만이 그렇게 순서 1 ... 1 만 생성을 위해 사용하지 않지만, 예를 들어, 숫자 1 ... 10,000 사용할 수 있습니다, 적용 할 수 있습니다.

    당신이 _numbers 테이블에 번호의 목록이있는 경우 당신은 문자열의 개별 문자를 얻기위한이 같은 쿼리를 작성할 수 있습니다 :

    SELECT number, substr(name, num, 1) 
        FROM users
        JOIN _numbers ON num < length(name)
        WHERE user_id = 1234
        ORDER BY num;
    

    당신이 10,000보다 큰 숫자를해야 할 경우 당신은 자체 테이블에 가입 할 수 있습니다 :

    SELECT n1.num * 10000 + n2.num
        FROM _numbers n1
        JOIN _numbers n2
        WHERE n1 < 100 
        ORDER BY n1.num * 10000 + n2.num; -- or just ORDER BY 1 meaning the first column
    
  10. ==============================

    10.이것은 이전의 대답 (https://stackoverflow.com/a/53125278/2009581)를 기반으로하지만, MySQL은 5.7와 호환된다. 그것은 복제 및 읽기 전용 사용자를 위해 작동합니다 :

    이것은 이전의 대답 (https://stackoverflow.com/a/53125278/2009581)를 기반으로하지만, MySQL은 5.7와 호환된다. 그것은 복제 및 읽기 전용 사용자를 위해 작동합니다 :

    SELECT x1.N + x10.N*10 + x100.N*100 + x1000.N*1000
      FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) x1,
           (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) x10,
           (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) x100,
           (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) x1000
     WHERE x1.N + x10.N*10 + x100.N*100 + x1000.N*1000 <= @max;
    

    이 [0, @max]의 범위에있는 정수를 생성한다.

  11. from https://stackoverflow.com/questions/186756/generating-a-range-of-numbers-in-mysql by cc-by-sa and MIT license