Bisakah kita membuat urutan di mysql?

table_options dapat berupa salah satu opsi tabel normal di CREATE TABLE tetapi yang paling dapat digunakan adalah ENGINE=... dan COMMENT=

NOMAXVALUE dan NOMINVALUE ada untuk memungkinkan seseorang membuat URUTAN menggunakan sintaks Oracle

Keterangan

CREATE SEQUENCE akan membuat urutan yang menghasilkan nilai baru saat dipanggil dengan

CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
0. Ini adalah alternatif untuk PENINGKATAN OTOMATIS ketika seseorang ingin memiliki kontrol lebih besar tentang bagaimana angka dihasilkan. Karena SEQUENCE menyimpan nilai-nilai (hingga
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
1) dalam beberapa kasus dapat jauh lebih cepat daripada AUTO INCREMENT. Manfaat lainnya adalah seseorang dapat mengakses nilai terakhir yang dihasilkan oleh semua urutan yang digunakan, yang menyelesaikan salah satu batasan dengan LAST_INSERT_ID()

CREATE SEQUENCE memerlukan hak istimewa CREATE

DROP SEQUENCE dapat digunakan untuk menghapus sequence, dan ALTER SEQUENCE untuk mengubahnya

Argumen untuk Membuat

Opsi berikut dapat digunakan

Jika

CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
2 digunakan maka urutan harus dimulai lagi dari
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
3 setelah kehabisan nilai. Nilai standarnya adalah
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
4

Batasan pada Membuat Argumen

Untuk dapat membuat urutan hukum, berikut ini harus berlaku

  • MAXVALUE >= mulai
  • NILAI MAKSIMAL > NILAI MINIL
  • MULAI >= MINVALUE
  • MAXVALUE <= 9223372036854775806 (LONGLONG_MAX-1)
  • MINVALUE >= -9223372036854775807 (LONGLONG_MIN+1)

Perhatikan bahwa urutan tidak dapat menghasilkan jumlah bit maksimum/minimum 64 karena kendala

CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
3 dan
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
6

DDL atom

Contoh

CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;

CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;

Pernyataan berikut gagal, karena kenaikan bertentangan dengan default

CREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10;
ERROR 4082 (HY000): Sequence 'test.s3' values are conflicting
_

Urutan dapat dibuat dengan menentukan nilai minimum dan maksimum yang bisa diterapkan

CREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;
_

Lihat juga

Komentar

Konten yang direproduksi di situs ini adalah milik dari pemiliknya masing-masing, dan konten ini tidak ditinjau sebelumnya oleh MariaDB. Pandangan, informasi, dan opini yang diungkapkan oleh konten ini tidak selalu mewakili MariaDB atau pihak lain mana pun

Ini adalah pertanyaan yang telah saya perjuangkan selama bertahun-tahun dan sepertinya saya akhirnya mendapatkan jawabannya (walaupun harus saya akui saya harus melakukan beberapa upaya pengembangan dan menambahkan beberapa ratus baris ke kode server). Server Percona untuk MySQL 8. 0. 20-11 menyertakan fitur baru yang didedikasikan untuk menyelesaikan masalah ini dengan tepat

Namun, sebelum mengungkapkan semua rahasianya, pertama-tama mari kita pertimbangkan solusi yang ada. Jadi, kami ingin mendapatkan yang berikut ini

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH ???

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.    . .

. N - 1 .

+-------+

N baris dalam set (0. 00 dtk)

Apa pilihan kita untuk melakukannya?

Cara Sekolah Tua

Mari kita mulai dengan solusi yang paling mudah

UNION untuk Menyelamatkan

Ini mungkin terdengar agak primitif tetapi solusi paling sederhana adalah menggabungkan hasil dari beberapa pernyataan SELECT menjadi satu set hasil tunggal dengan UNION

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH 0 SEBAGAI nilai UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Meskipun ini dapat bekerja untuk jumlah yang lebih kecil, solusi ini tidak dapat diperluas

Tabel Yang Ada Dengan Kolom Yang Unik

Katakanlah kita sudah memiliki tabel dengan kolom unik dari tipe data apa pun. Contohnya

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

BUAT TABEL t1(id CHAR TIDAK NULL< PRIMARY KEY);

Kueri Oke, 0 baris terpengaruh (0.01 dtk)

 

MASUKKAN KELUAR t1 NILAI ( 'a'), ('b'), ('c'), ('d');

Kueri Oke, 4 baris terpengaruh (0.00 dtk)

Rekor. 4    Duplikat. 0   Peringatan . 0

 

PILIH * DARI t1;

+----+

. id .

+----+

. a    .

. b    .

. c    .

. d    .

+----+

4 baris dalam set (0. 00 dtk)

Sekarang, kita dapat menggabungkan tabel ini dengan salinannya sendiri dan memilih jumlah rekaman yang id dalam salinannya kurang dari atau sama dengan id dalam tabel asli

MySQL

1

2

3

4

5

6

7

8

9

PILIH JUMLAH (*) - 1 AS< . id value FROM t1, t1 AS t2 WHERE t2.id < = t1. id GROUP OLEH t1. id;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

Kelemahan utama dari solusi ini adalah kompleksitas kuadratiknya pada N yang dapat menyebabkan penggunaan sumber daya yang signifikan ketika N besar

Penambahan Variabel Sesi Dalam SELECT

Asalkan kita sudah memiliki tabel t1 seperti pada contoh sebelumnya (meskipun batasan kolom unik tidak diperlukan di sini), kita dapat menggabungkannya dengan satu nilai SELECT yang menetapkan nilai awal ke variabel sesi. Pada saat yang sama, untuk setiap catatan dari tabel yang ada, nilai variabel sesi ini akan bertambah

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH (@val . = @val + 1) - 1 AS value FROM t1, (SELECT @val := 0) AS tt;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set , 2 warnings (0.00 dtk)

Yang ini tidak buruk. itu dapat diperluas, kompleksitas linier pada N tidak menyebabkan overhead yang tidak perlu, dan satu-satunya kelemahan adalah persyaratan untuk memiliki tabel yang ada

Bergabung dengan Beberapa Tampilan

Kita selalu dapat menggabungkan beberapa tabel (atau tampilan) yang berisi lebih dari satu record untuk mengalikan jumlah total record dalam kumpulan hasil

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

BUAT LIHAT binary_v AS PILIH 0 AS v UNION ALL SELECT 1;

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

PILIH * DARI binary_v ORDER BY v;

+---+

. v .

+---+

. 0 .

. 1 .

+---+

2 baris di set (0. 00 dtk)

 

PILIH b0. v + b1. v * 2 + b2. v * 4 AS nilai FROM binary_v b0, binary_v b1, binary_v b2 ORDER BY value;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

.      4 .

.      5 .

.      6 .

.      7 .

+-------+

8 baris dalam set (0. 00 dtk)

Dengan menggunakan pendekatan yang sama, dengan memotong K instance dari binary_v kita dapat menghasilkan urutan nilai 2^K. Demikian pula, kita dapat membuat tampilan untuk digit dan hasilnya mendapatkan nilai 10^K

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

BUAT LIHAT decimal_v AS PILIH 0 AS v UNION ALL SELECT 1

UNION ALL PILIH 2 UNION ALL PILIH 3 UNION ALL SELECT 4 UNION ALL SELECT 5

UNION ALL PILIH 6 UNION ALL PILIH 7 UNION ALL SELECT 8 UNION ALL SELECT 9;

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

PILIH * DARI decimal_v ORDER by v;

+---+

. v .

+---+

. 0 .

. 1 .

. 2 .

. 3 .

. 4 .

. 5 .

. 6 .

. 7 .

. 8 .

. 9 .

+---+

10 baris di set (0. 00 dtk)

 

PILIH d0. v + d1. v * 10 + d2. v * 100 AS nilai

  DARI decimal_v d0, decimal_v d1, decimal_v d2 ORDER BY value;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.    . .

.    998 .

.    999 .

+-------+

1000 baris dalam set (0. 01 dtk)

Meskipun ini tampaknya cukup mudah untuk dipahami, rencana eksekusi kueri semacam itu pasti jauh dari sempurna

Klasisisme

Prosedur Tersimpan

Pada dasarnya, sebelum memilih, kita dapat membuat tabel sementara dan mengisinya dengan nomor yang diperlukan menggunakan prosedur tersimpan yang telah dibuat sebelumnya

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

BUAT SEMENTARA TABEL t1 ( value BIGINT UNSIGNED NOT NULL PRIMARY KEY);

Kueri Oke, 0 baris terpengaruh (0.01 dtk)

 

PANGGILAN hasilkan_seq(4);

Kueri Oke, 1 baris terpengaruh (0.01 dtk)

 

PILIH * DARI t1 ORDER BY value;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Prosedur tersimpan itu sendiri dapat didefinisikan sebagai berikut

MySQL

1

2

3

4

5

6

7

8

9

10

pembatas .

BUAT PROSEDUR hasilkan_seq(n BIGINT UNSIGNED)

MULAI

  MENYATAKAN i BESAR TIDAK DITANDATANGANI DEFAULT 0;

  SEMENTARA i < n DO

    MASUKKAN KELUAR t1 NILAI(i);

    SET i = i + 1;

  AKHIR SAAT ;

AKHIR .

pembatas ;

Rencana eksekusi untuk pendekatan ini hampir sempurna, satu-satunya kelemahan adalah kebutuhan untuk memanggil generate_seq() sebelum menggunakan urutan

Pernyataan yang Disiapkan

Mari kita coba sedikit mengotomatiskan solusi berbasis UNION. Alih-alih mengulangi klausa UNION secara manual, kami dapat membuat pernyataan ini secara dinamis

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

SET @generated_stmt = hasilkan_seq_stmt(4);

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

SIAPKAN stmt1 DARI @generated_stmt;

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

Pernyataan disiapkan

 

JALANKAN stmt1;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

 

DEALOKASI SIAPKAN stmt1;

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

Di mana generate_seq_stmt() dapat didefinisikan sebagai berikut

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

pembatas .

BUAT FUNGSI hasilkan_seq_stmt(n BIGINT UNSIGNED )< RETURNS TEXT DETERMINISTIC

MULAI

  MENYATAKAN res TEKS DEFAULT 'SELECT 0 AS value';

  MENYATAKAN i BESAR TIDAK DITANDATANGANI DEFAULT 1;

  SEMENTARA i < n DO

    SET res = CONCAT(res, ' UNION ALL SELECT ', i);

    SET i = i + 1;

  AKHIR SAAT ;

  KEMBALIKAN res;

AKHIR .

pembatas ;

Ini tampaknya berhasil, tetapi kerugian utama dari solusi ini adalah tidak dapat disematkan langsung ke dalam kueri yang lebih kompleks (kecuali yang terakhir juga diubah menjadi pernyataan yang disiapkan)

Mesin Penyimpanan Urutan (MariaDB)

MariaDB, di sisi lain, mengambil pendekatan yang sama sekali berbeda. Alih-alih memperluas sintaks SQL dan menciptakan konstruksi baru, di versi 10. 0, mereka mengimplementasikan Sequence Storage Engine yang membuat tabel virtual dan singkat secara otomatis saat pengguna membutuhkannya. Yang harus Anda lakukan adalah menjalankan yang berikut ini

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH * DARI seq_0_to_3;

+-----+

. seq .

+-----+

.    0 .

.    1 .

.    2 .

.    3 .

+-----+

4 baris dalam set (0. 00 dtk)

This seems nice and clear, however, the idea of reserving an almost infinite number of table names (seq__ and seq___) for each database is not very appealing. For instance, you cannot do:

MySQL

1

2

BUAT TABEL seq_1_to_100 (col INT) ENGINE = InnoDB;

ERROR 1050 (42S01). Tabel 'seq_1_to_100' sudah ada

Pendekatan ini membutuhkan banyak penanganan kesalahan yang tidak perlu dan percabangan tambahan dalam kode server. Dokumentasi mereka juga menyebutkan beberapa trik (seperti ALTER TABLE seq_1_to_100 ENGINE = BLACKHOLE) yang dapat Anda terapkan untuk mengatasi masalah tertentu, tetapi secara umum, mereka hanya menambahkan lebih banyak kerumitan dan kasus sudut
Personally, I like the syntax SELECT * FROM , but implementing this construct as a new storage engine was not the best design decision.

Cara Modern

Ekspresi Tabel Umum Rekursif (CTE)

Di MySQL Server 8. 0. 1, Oracle memperkenalkan Common Table Expressions (CTE), baik non-rekursif maupun rekursif

MySQL

1

2

3

4

5

6

7

8

9

10

11

DENGAN REKURSIF seq AS ( SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq WHERE value < 3)

  PILIH * DARI seq;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Meskipun solusi ini dapat digunakan untuk batas atas N yang cukup luas dan tampaknya persis seperti yang kita butuhkan, saya ragu ini dapat dibaca/mudah dipahami

Mulai dari MySQL Server 8. 0. 19, Anda dapat sedikit menyederhanakan kueri ini menggunakan LIMIT alih-alih WHERE

MySQL

1

2

3

4

5

6

7

8

9

10

11

DENGAN REKURSIF seq AS ( SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq LIMIT 4)

  PILIH * DARI seq;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Namun, kedua solusi tersebut memiliki keterbatasan. Secara default, batas atas N tidak boleh terlalu tinggi

MySQL

1

2

3

DENGAN REKURSIF seq AS ( SELECT 0 AS value UNION ALL SELECT value + 1 FROM seq LIMIT 1002)

  PILIH * DARI seq;

ERROR 3636 (HY000). Rekursif kueri dibatalkan setelah 1001 . iterations. Coba tingkatkan @@cte_max_recursion_depth menjadi a larger value.

Peningkatan dapat menggeser batasan ini

NILAI BARIS(…), BARIS(…) …

Jika Anda beruntung yang sudah mengupgrade ke MySQL Server 8. 0. 19, Anda dapat menggunakan Pernyataan VALUES (konstruktor nilai tabel yang juga berfungsi sebagai pernyataan SQL mandiri)

MySQL

1

2

3

4

5

6

7

8

9

10

NILAI ROW (0), ROW (1 ROW(2), ROW(3);

+---------+

. kolom_0 .

+---------+

.           0 .

.           1 .

.           2 .

.           3 .

+---------+

4 baris dalam set (0. 00 dtk)

Yang ini sedikit lebih mudah daripada berbasis UNION tetapi masih kurang ekstensibilitas

JSON_TABLE()

Di MySQL Server 8. 0. 4 Oracle memperkenalkan fungsi JSON_TABLE() baru yang dapat mengekstrak data dari dokumen JSON dan mengembalikannya sebagai tabel relasional yang memiliki kolom tertentu. Tetapi Anda mungkin bertanya bagaimana ini bahkan berpotensi terkait dengan menghasilkan urutan numerik. Mari kita perhatikan contoh berikut

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

PILIH *

DARI JSON_TABLE( '[{"a". 0},{"a". 1},{"a". 2},{"a". 3}]' ,

                 "$[*]" KOLOM ( nilai . a" BIGINT UNSIGNED PATH "$.a" )

       ) AS tt;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Di sini, kami meneruskan dokumen JSON sederhana ke fungsi JSON_TABLE(). Dokumen JSON itu adalah larik yang terdiri dari serangkaian objek dengan kunci yang telah ditentukan "a". Kami mengulangi semua elemen array yang cocok dengan ekspresi jalur JSON “$[*]” dan mengekstrak nilai dari “$. a” ke dalam kolom bertipe BIGINT UNSIGNED dengan nilai nama
Meskipun pada titik ini overhead sintaksisnya sangat berlebihan, saya mulai melihat cahaya di ujung terowongan

Kami dapat melakukan yang lebih baik dan meningkatkan contoh JSON_TABLE() pertama kami

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

PILIH tt. rowid - 1 AS nilai

  DARI JSON_TABLE( '[{},{},{},{}]',

                  "$[*]" KOLOM (baris FOR ORDINALITY)

       ) AS tt;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Di sini, kami memiliki larik objek kosong dan menggunakan konstruk khusus UNTUK ORDINALITAS yang setara dengan menentukan kolom sebagai AUTO_INCREMENT dalam pernyataan CREATE TABLE. Meskipun saya harus mencatat bahwa kami masih memiliki sejumlah objek JSON kosong yang telah ditentukan sebelumnya dalam array kami. Itu tidak cukup – kita harus masuk lebih dalam

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

SET @upper_bound = 4;

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

PILIH tt. rowid - 1 AS nilai

  DARI JSON_TABLE( CONCAT ( '[{}', REPEAT(',{}', @upper_bound - 1), ']'),

                  "$[*]" KOLOM (baris FOR ORDINALITY)

       ) AS tt;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Kami hampir sampai

Cara Post-Modern

Pertama-tama mari kita rangkum apa yang berhasil kita capai pada contoh sebelumnya

  • Hapus konstruksi sintaksis SELECT … FROM JSON_TABLE(…) AS tt (walaupun argumen fungsi masih non-sepele)
  • Kami membuat konstruk ini menghasilkan jumlah baris yang berbeda tergantung pada nilai variabel @upper_bound
  • Konstruk ini dapat digunakan di mana saja di mana pernyataan tabel turunan lainnya diperbolehkan
  • Konstruk ini tidak hanya tergantung pada nilai variabel sesi, dalam kasus tabel yang digabungkan, ini dapat menghasilkan jumlah baris yang berbeda tergantung pada nilai dari kolom tabel lain.

SEQUENCE_TABLE()

Singkatnya, akan sangat bagus untuk memiliki fungsi, katakanlah SEQUENCE_TABLE() yang akan berperilaku identik dengan JSON_TABLE(CONCAT('[{}', REPEAT(',{}', @upper_bound – 1), '] kita
Sayangnya, MySQL Server 8. 0. 19 tidak memiliki fungsi seperti itu

Harus saya akui akan sangat buruk dari sisi saya untuk menyelesaikan posting blog ini pada saat ini dengan mengatakan "Solusi berbasis JSON_TABLE () adalah yang terbaik yang kami dapatkan sejauh ini. Hanya itu yang bisa kami lakukan, terima kasih sudah membaca”, jadi saya tidak akan melakukannya
Sebagai gantinya, saya akan mengumumkannya di Percona Server 8. 0. 20-11 kami menerapkan fitur khusus Percona baru yang disebut 'SEQUENCE_TABLE()'

Singkat cerita, sekarang Anda bisa menulis yang berikut ini

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH * DARI SEQUENCE_TABLE(4) AS< tt;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Dan "ya", semudah dan sejelas yang Anda lihat. Sekarang, mari kita perhatikan contoh yang sedikit lebih rumit
Bagaimana jika kita ingin menghasilkan urutan dari 4 hingga 7 inklusif?

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH nilai AS hasil DARI SEQUENCE_TABLE(8) AS tt WHERE value >= 4;

+--------+

. hasil .

+--------+

.        4 .

.        5 .

.        6 .

.        7 .

+--------+

4 baris dalam set (0. 00 dtk)

Alternatifnya, Anda bisa menulis

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH nilai + 4 AS result FROM SEQUENCE_TABLE(4) AS tt;

+--------+

. hasil .

+--------+

.        4 .

.        5 .

.        6 .

.        7 .

+--------+

4 baris dalam set (0. 00 dtk)

Contoh lain, bilangan genap dari 0 sampai 6 inklusif

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH nilai AS hasil DARI SEQUENCE_TABLE(8) AS tt WHERE value % 2 = 0;

+--------+

. hasil .

+--------+

.        0 .

.        2 .

.        4 .

.        6 .

+--------+

4 baris dalam set (0. 00 dtk)

kalau tidak

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH nilai * 2 AS result FROM SEQUENCE_TABLE(4) AS tt;

+--------+

. hasil .

+--------+

.        0 .

.        2 .

.        4 .

.        6 .

+--------+

4 baris dalam set (0. 00 dtk)

Contoh lain, angka dari 0 sampai 3 dimasukkan dalam urutan terbalik

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH nilai AS hasil DARI SEQUENCE_TABLE(4) AS tt ORDER BY value DESC;

+--------+

. hasil .

+--------+

.        3 .

.        2 .

.        1 .

.        0 .

+--------+

4 baris dalam set (0. 00 dtk)

kalau tidak

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH 3 - nilai AS result FROM SEQUENCE_TABLE(4) AS tt;

+--------+

. hasil .

+--------+

.        3 .

.        2 .

.        1 .

.        0 .

+--------+

4 baris dalam set (0. 00 dtk)

SEQUENCE_TABLE() juga dapat digunakan untuk menghasilkan sekumpulan angka acak

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH LANTAI ( RAND () * 100) AS result FROM SEQUENCE_TABLE(4) AS tt;

+--------+

. hasil .

+--------+

.        6 .

.      37 .

.      67 .

.      25 .

+--------+

4 baris dalam set (0. 00 dtk)

Harap perhatikan bahwa pola penggunaan untuk SEQUENCE_TABLE() tidak terbatas pada angka saja. Kita dapat, misalnya, membuat daftar literal string yang telah ditentukan sebelumnya (mengonversi baris menjadi kolom, jika diinginkan)

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH ELT ( nilai + 1, 'a', 'b', 'c', 'd') AS result FROM SEQUENCE_TABLE(4) AS tt;

+--------+

. hasil .

+--------+

. a        .

. b        .

. c        .

. d        .

+--------+

4 baris dalam set (0. 00 dtk)

Atau sama tetapi dengan nilai berulang

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

PILIH ELT ( nilai % 4 + 1, 'a', 'b', 'c', 'd') AS result FROM SEQUENCE_TABLE(8) AS tt;

+--------+

. hasil .

+--------+

. a        .

. b        .

. c        .

. d        .

. a        .

. b        .

. c        .

. d        .

+--------+

8 baris dalam set (0. 00 dtk)

Terakhir, fungsi tabel ini juga dapat membantu menghasilkan nilai string acak semu

MySQL

1

2

3

4

5

6

7

8

9

10

PILIH MD5 ( nilai ) AS result FROM SEQUENCE_TABLE(4) AS tt;

+----------------------------------+

. hasil                            .

+----------------------------------+

. cfcd208495d565ef66e7dff9f98764da .

. c4ca4238a0b923820dcc509a6f75849b .

. c81e728d9d4c2f636f067f89cc14862c .

. eccbc87e4b5ce2fe28308fd9f2a7baf3 .

+----------------------------------+

4 baris dalam set (0. 00 dtk)

Konstruksi ini dapat digunakan untuk mengisi tabel yang ada

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

BUAT TABEL t1 (id BESAR UNSIGNED);

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

MASUKKAN KELUAR t1 PILIH * FROM SEQUENCE_TABLE(4) AS tt;

Kueri Oke, 4 baris terpengaruh (0.00 dtk)

Rekor. 4    Duplikat. 0   Peringatan . 0

 

PILIH * DARI t1;

+------+

. id    .

+------+

.      0 .

.      1 .

.      2 .

.      3 .

+------+

4 baris dalam set (0. 00 dtk)

Atau bahkan untuk membuat yang baru dengan nilai yang sudah diisi sebelumnya

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

BUAT TABEL t1 AS PILIH * FROM SEQUENCE_TABLE(4) AS tt;

Kueri Oke, 4 baris terpengaruh (0.00 dtk)

Rekor. 4    Duplikat. 0   Peringatan . 0

 

PILIH * DARI t1;

+-------+

. nilai .

+-------+

.      0 .

.      1 .

.      2 .

.      3 .

+-------+

4 baris dalam set (0. 00 dtk)

Saya cukup yakin ada banyak kasus penggunaan lainnya (katakanlah, menghasilkan angka Fibonacci atau mencetak semua bilangan prima dalam rentang tertentu) dan Anda pasti akan dapat menemukan banyak milik Anda sendiri

Kesimpulan

Dalam posting blog ini, saya mencoba menunjukkan bahwa SQL adalah bahasa yang cukup kuat dan memungkinkan kita melakukan banyak hal eksotis. Namun, sangat menyebalkan bahwa dalam beberapa kasus yang sangat sederhana, satu-satunya cara untuk melakukan apa yang Anda inginkan adalah menggunakan artileri berat. Contoh dengan SEQUENCE_TABLE() yang saya demonstrasikan menunjukkan bahwa jika menambahkan fungsionalitas baru dengan memperluas kode server adalah satu-satunya pilihan yang tersisa, jangan takut – tidak apa-apa untuk melakukan ini, terutama jika Anda tahu apa yang harus dilakukan


Ringkasan solusi kami “Bangun dan Jalankan dengan Percona Server untuk MySQL” menguraikan penyiapan database MySQL® di lokasi menggunakan Percona Server untuk MySQL. Ini mencakup failover dan komponen kelangsungan bisnis dasar

Bagaimana menjalankan urutan di MySQL?

Memulai Urutan pada Nilai Tertentu

Bagaimana cara membuat urutan angka di MySQL?

Untuk membuat urutan di MySQL secara otomatis, Anda mengatur atribut AUTO_INCREMENT untuk sebuah kolom , yang biasanya berupa kolom primary key. Aturan berikut diterapkan saat Anda menggunakan atribut AUTO_INCREMENT. Setiap tabel hanya memiliki satu kolom AUTO_INCREMENT yang tipe datanya biasanya bilangan bulat.

Bagaimana Anda membuat urutan dalam SQL?

Sintaks. BUAT URUTAN nama_urutan MULAI DENGAN nilai_awal KENAIKAN BERDASARKAN nilai_peningkatan MINVALUE nilai minimum MAXVALUE nilai maksimum SIKLUS. NOCYCLE ; sequence_name. Nama urutan. nilai_awal. nilai awal dari mana urutan dimulai.

Apa urutan bagaimana itu dihasilkan di MySQL?

Buat tabel untuk menampung penghitung urutan dan menginisialisasi. urutan mysql> CREATE TABLE (id INT NOT NULL); . mysql> UPDATE urutan SET id=LAST_INSERT_ID(id+1);