AliSQL, sıra değerlerini almayı basitleştirmek için Sequence Engine özelliğini sunar.
Giriş
Kalıcı veritabanı sistemleri; tek düğümde iş birincil anahtarları, dağıtık sistemlerde genel benzersiz tanımlayıcılar veya birden çok sistem arasında yinelenmezlik kontrolü gibi kullanım durumları için monoton artan benzersiz değerlere ihtiyaç duyar. Farklı veritabanı sistemleri farklı uygulama yöntemleri sunar. Örneğin, MySQL AUTO_INCREMENT niteliğini sağlarken Oracle ve SQL Server SEQUENCE nesnelerini sağlar.
MySQL veritabanlarında, tarih veya kullanıcı ID'si gibi ek bilgilerle birlikte benzersiz bir değeri sarmak istediğinizde AUTO_INCREMENT kullanımı elverişsiz olabilir. Pratikte genellikle aşağıdaki geçici çözümler uygulanır:
Sıra değerlerini uygulamadan veya proxy'den oluşturun. Ancak durumu uygulama tarafında tutmak ölçek büyütme ve küçültme işlemlerini karmaşıklaştırır.
Sıra değerlerini veritabanındaki simüle edilmiş bir tablodan oluşturun. Bu yöntem, benzersiz değerleri almak için mantığı sarmak ve basitleştirmek amacıyla ara katman gerektirir.
Sequence Engine, diğer veritabanlarının kullandığı yöntemlerle mümkün olduğunca uyumlu olacak şekilde tasarlanmıştır.
Sequence Engine, MySQL depolama motoru arayüzünü uygular ancak kalıcı verileri depolamak için InnoDB veya MyISAM gibi mevcut bir depolama motoru kullanır. Bu sayede XtraBackup gibi üçüncü taraf araçlarla uyumludur. Dolayısıyla Sequence Engine mantıksal bir motordur.
Sequence Engine, NEXTVAL ilerlemesini ve önbellek yönetimini gerçekleştirmek için Sequence Handler arayüzü üzerinden Sequence nesnelerine erişir. Ardından son veri erişimi için istekleri temel tablonun alttaki depolama motoruna iletir.
Ön Koşullar
Örneğiniz aşağıdaki sürümlerden biri olmalıdır:
RDS for MySQL 8.4
Alt motor sürümü 20190816 veya üzeri olan RDS for MySQL 8,0
Alt motor sürümü 20210430 veya üzeri olan RDS for MySQL 5,7
Alt motor sürümü 20170901 veya üzeri olan RDS for MySQL 5,6
Bu özellik RDS Enterprise Edition örneklerinde desteklenmez.
Sınırlamalar
Sıralar alt sorguları veya join işlemlerini desteklemez.
Bir sıranın yapısını görüntülemek için
SHOW CREATE TABLEkomutunu kullanabilirsiniz.Tablo oluştururken Sequence motorunu belirtemezsiniz. Sıra tabloları yalnızca Sıra oluşturma sözdizimi kullanılarak oluşturulabilir.
Sıra oluşturma
CREATE SEQUENCE [IF NOT EXISTS] <database_name>.<sequence_name>
[START WITH <constant>]
[MINVALUE <constant>]
[MAXVALUE <constant>]
[INCREMENT BY <constant>]
[CACHE <constant> | NOCACHE]
[CYCLE | NOCYCLE]
;
Köşeli parantez ([]) içindeki parametreler isteğe bağlıdır.
Aşağıdaki tabloda parametreler açıklanmaktadır.
Parametre | Açıklama |
START WITH | Sıranın başlangıç değeri. |
MINVALUE | Sıranın minimum değeri. |
MAXVALUE | Sıranın maksimum değeri. Not NOCYCLE belirtirseniz maksimum değere ulaşıldığında aşağıdaki hata döndürülür: |
INCREMENT BY | Ardışık sıra değerleri arasındaki adım. |
CACHE/NOCACHE | Önbellek boyutu. Daha iyi performans için büyük bir önbellek boyutu ayarlayabilirsiniz. Ancak örnek yeniden başlatılırsa önbellekteki kullanılmayan değerler kaybolur. |
CYCLE/NOCYCLE | Sıranın tükendikten sonra MINVALUE değerinden yeniden başlayıp başlamayacağını belirtir. Geçerli değerler:
|
Örnek:
create sequence s
start with 1
minvalue 1
maxvalue 9999999
increment by 1
cache 20
cycle;
mysqldump kullanılarak oluşturulan yedeklemelerle uyumluluğu sağlamak için bir sıra tablosu oluşturup ilk kaydı ekleyerek de sıra oluşturabilirsiniz. Örnek:
CREATE TABLE schema.sequence_name ( `currval` bigint(21) NOT NULL COMMENT 'current value',
`nextval` bigint(21) NOT NULL COMMENT 'next value',
`minvalue` bigint(21) NOT NULL COMMENT 'min value',
`maxvalue` bigint(21) NOT NULL COMMENT 'max value',
`start` bigint(21) NOT NULL COMMENT 'start value',
`increment` bigint(21) NOT NULL COMMENT 'increment value',
`cache` bigint(21) NOT NULL COMMENT 'cache size',
`cycle` bigint(21) NOT NULL COMMENT 'cycle state',
`round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1;
INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;
Sıra tablosu tanımı
Bir sıra bir tabloda depolanır. Tanımını SHOW CREATE TABLE komutunu çalıştırarak görüntüleyebilirsiniz. Örnek:
SHOW CREATE TABLE schema.sequence_name;
CREATE TABLE schema.sequence_name (
`currval` bigint(21) NOT NULL COMMENT 'current value',
`nextval` bigint(21) NOT NULL COMMENT 'next value',
`minvalue` bigint(21) NOT NULL COMMENT 'min value',
`maxvalue` bigint(21) NOT NULL COMMENT 'max value',
`start` bigint(21) NOT NULL COMMENT 'start value',
`increment` bigint(21) NOT NULL COMMENT 'increment value',
`cache` bigint(21) NOT NULL COMMENT 'cache size',
`cycle` bigint(21) NOT NULL COMMENT 'cycle state',
`round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1
Sorgu sözdizimi
Sıralar aşağıdaki sorgu sözdizimlerini destekler:
-
SELECT nextval(<sequence_name>),currval(<sequence_name>) FROM <sequence_name>;NotRDS for MySQL 8.4, 8,0 ve 5,7 için geçerlidir.
-
SELECT <sequence_name>.currval, <sequence_name>.nextval FROM dual;NotRDS for MySQL 8.4, 8,0, 5,7 ve 5,6 için geçerlidir.
Örnek:
mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
| 24 | 25 |
+--------------+--------------+
1 row in set (0.03 sec)
Yeni oluşturulan bir sırayı sorgulayabilmeniz için önce NEXTVAL öğesini bir kez çağırarak sırayı başlatmanız gerekir. Aksi takdirde Sequence 'xxx' is not yet defined in current session hatası döndürülür.
NEXTVAL çağrısı örneği:
SELECT <sequence_name>.nextval FROM dual;