Əsas səhifə > MySQL > AUTO_INCREMENT

AUTO_INCREMENT

AUTO_INCREMENT-dən mənə elə gəlir ki, hamı istifadə edir çox məhşurdur. Artıq əl də öyrəşib id int AUTO_INCREMENT yazmağa. Bir çox maraqlı xüsusiyyətləri var ki, onları yazmağa çalışıram.
Bəli Adı üstündə auto increment yəni avtomatik artırma. Bu attribute bizləri, əziyyətli manual increment-dən azad edir. Həqiqətən də çox işimizə yarayır. Adi misallarla izah etməyə çalışaq. Table yaradaq:

create table auto_increment_test (
    id int auto_increment,
    name varchar(10)
);

🙂 ERROR-da da deyildiyi kimi, AUTO_INCREMENT olan column mütləq index-lənməlidir(ordakı key bu mənadadır). Bu index də adətən\həmişə PRİMARY KEY olur.

mysql> create table auto_increment_test (
    ->     id int auto_increment,
    ->     name varchar(10),
    ->     primary key (id)
    -> );
Query OK, 0 rows affected (0.15 sec)

Table yaratdıq indi də onun üzərində biraz işləyək.
İnsert edək:

insert into auto_increment_test(name) values('Shahriyar');

insert into auto_increment_test(name) values('Orxan');

insert into auto_increment_test(name) values('Elvin');

Və select edək:

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  3 | Elvin     |
+----+-----------+
3 rows in set (0.00 sec)

Həqiqətən də görürük ki, AUTO_INCREMENT İD-ni avtomatik artırır…Çox əlverişlidir…Manual olaraq:

insert into auto_increment_test(id,name) values(1,'Shahriyar');

insert into auto_increment_test(id,name) values(2,'Orxan');

insert into auto_increment_test(id,name) values(3,'Elvin');

yazmağa ehtiyac yoxdu…
İnsert-lərimizə dava edək:


insert into auto_increment_test(id,name) values(NULL,'Vusal');

insert into auto_increment_test(id,name) values(0,'Natiq');

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  3 | Elvin     |
|  4 | Vusal     |
|  5 | Natiq     |
+----+-----------+
5 rows in set (0.00 sec)

Gördüyümüz kimi AUTO_INCREMENT-li column-a 0 və NULL insert etmək istədikdə, 0 və NULL sadəcə iqnor edilir və adi qaydada avtomatik artırma baş verir.
*****************************************
İndiki halda bizim table-da 5 id var, yəni bunlar 1,2,3,4,5-dir…Indi isə İD-si 5 olan yəni sonuncı record-u silək:

delete from auto_increment_test where id=5;

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  3 | Elvin     |
|  4 | Vusal     |
+----+-----------+
4 rows in set (0.00 sec)

Və yeni bir insert edək:

insert into auto_increment_test(name) values('Mahmud');

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  3 | Elvin     |
|  4 | Vusal     |
|  6 | Mahmud    |
+----+-----------+
5 rows in set (0.00 sec)

Bəli yeni İD=6 oldu…Əslində fikirləşmək olardı ki, 4-dən sonra 5 gəlir və yeni İD də 5 olacaq amma baxmayaraq ki biz İD=5-i sildik MySQL internal olaraq increment-i yadda saxlayır…Yəni table-dan silinsə belə bir sonrakı increment məhz o silinən yerdən başlayır.

Mövzunu davam etdirək…Update edərək İD-3 olan recordun İD-sini=15 edək:

update auto_increment_test set id=15 where name='Elvin';

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  4 | Vusal     |
|  6 | Mahmud    |
| 15 | Elvin     |
+----+-----------+
5 rows in set (0.00 sec)

daha sonra insert edək:


insert into auto_increment_test(name) values('Necef');

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  4 | Vusal     |
|  6 | Mahmud    |
|  7 | Necef     |
| 15 | Elvin     |
+----+-----------+
6 rows in set (0.00 sec)

Qəribədir 🙂 Əslində mən də gözləyirdim ki, yeni İD=16 olacaq çünki sonuncu İD=15 idi amma yox elə olmadı..Məncə Update zamanı biz İD-ni birbaşa qeyd etdiyimiz üçün bu zaman MySQL bunu increment kimi qəbul etmir və öz implicit increment-inə qaldığı yerdən davam edir.
İndi isə İD-ni biz explicit olaraq insert zamanı verək:

insert into auto_increment_test(id,name) values(20,'Behmen');

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  4 | Vusal     |
|  6 | Mahmud    |
|  7 | Necef     |
| 15 | Elvin     |
| 20 | Behmen    |
+----+-----------+
7 rows in set (0.00 sec)

Və daha sonra da adi qaydada insert verək:

insert into auto_increment_test(name) values('Resad');

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Shahriyar |
|  2 | Orxan     |
|  4 | Vusal     |
|  6 | Mahmud    |
|  7 | Necef     |
| 15 | Elvin     |
| 20 | Behmen    |
| 21 | Resad     |
+----+-----------+
8 rows in set (0.00 sec)

İndi isə bayaqkının tam əksi olaraq təzə İD=21-dir 🙂 Explicit insert zamanı yəqin ki, MySQL-in implicit increment saygaci həmin yeni İD-yə keçir və məhz bu səbəbdəndir ki,yeni insert-lər zamanı increment yeni İD-dən başlayır.
****************************************
Daha bir maraqlı hadisə var. Bəs deyək ki, update vasitəsilə hər hansı bir İD-yə NULL qiymətini vermək istəyirik onda nə baş verəcək:

update auto_increment_test set id=null where name='Vusal';

mysql> select * from auto_increment_test;
+----+-----------+
| id | name      |
+----+-----------+
|  0 | Vusal     |
|  1 | Shahriyar |
|  2 | Orxan     |
|  6 | Mahmud    |
|  7 | Necef     |
| 15 | Elvin     |
| 20 | Behmen    |
| 21 | Resad     |
+----+-----------+
8 rows in set (0.00 sec)

Görürük ki, bu zaman yuxarıda bir yerlərdə qeyd etdiyimiz kimi NULL iqnor edilib, əvəzinə adi qaydada auto increment olunmur…İndiki halda NULL iqnor edilir və İD-nin qiyməti =0 olur. Və həmçinin Warning də qeydə alınır.

show warnings;

Warning', '1048', 'Column \'id\' cannot be null'

Çünki auto_increment column NOT NULL-dur. Yəni NULL qiymətlər qəbul edə bilməz…
Mövzuda Əsas yerlərə toxunduq 1 xırda mövzu qalıb ki onu da documentation-dan copy eliyib atıram bura :

When you reach the upper limit of an AUTO_INCREMENT column, an attempt to generate the next sequence value results in a duplicate-key error. This is a manifestation of MySQL’s general out-of-range value clipping behavior. For example, assume that you have a TINYINT UNSIGNED column as an AUTO_INCREMENT column and that it currently contains 254 as the maximum sequence value. The upper limit for this data type is 255, so the next insert generates a sequence value of 255 and successfully stores it in the new record. However, the insert after that fails because MySQL generates the next sequence value, which is 256. Because 256 is higher than the column’s upper limit of 255, MySQL clips 256 down to 255 and attempts to insert that value. But because 255 is already present in the table, a duplicate-key error occurs.”

Təşəkkürlər 🙂

Kateqoriyalar: MySQL Etiketlər: , ,
  1. Heç bir şərh yoxdur.
  1. No trackbacks yet.

Bir şərh yazın