Daha çox

QGIS-də şəxsiyyət sütunu üçün auto_increment yolu varmı?


Mən qondarma bir xəritə yaradıram və buna görə çox nöqtə, sətir və çoxbucaqlı nöqtələr yaratmalıyam. Daha sonra məlumatlarımı geojson olaraq ixrac edirəm. Ancaq bundan əvvəl hər bir elementə özünəməxsus bir şəxsiyyət vəsiqəsi vermək məcburiyyətindəyəm.

Xüsusi bir çeşidləmə ehtiyacım yoxdur, çünki ən böyük çoxbucaqlı ən kiçik şəxsiyyəti alır. Mən indicə ehtiyac hamısı çoxbucaqlar ilə bir Şəxsiyyət vəsiqəsi Sonda, olmadan edir o əl ilə kimi indi etməliyəm.

Kimsə bunu necə edəcəyini bilsə yaxşı olar.


Sahə kalkulyatorundan istifadə etmək yolu:

Heç bir şəxsiyyət vəsiqəsi verilmədi

  1. Hər hansı bir Id daxil etmədən bütün xüsusiyyətləri rəqəmləşdirin.
  2. İxrac etməzdən əvvəl, sahə kalkulyatorunu istifadə edərək '$ Id' ifadəsi ilə unikal İDləri yeniləyin.

Bəzi şəxsiyyət sənədləri artıq verilmişdir

  1. Əgər artıq şəxsiyyət vəsiqəniz varsa, '- $ Id' istifadə edə bilərsiniz. Yeni sıra Xüsusiyyətləri seçdiyinizə əmin olun ki, id sətirində 'NULL' deməkdir. Sadəcə sütunu sifariş edərək bunu edin.
  2. İndi şəkillərdən addımlar atın:


Hallelujah! Və ya Eureka. Və ya hər hansı bir şey. Bu edilə bilər. Forma şəkli ilə.

  1. Əgər onsuz da yoxdursa, xüsusiyyət identifikatorunu ehtiva edən bir sahə əlavə edin, "FID" yazın Bütün nömrə (tam ədəd).
  2. Açıq Layer xüsusiyyətləri (qatı sağ vurun və seçin Xüsusiyyətlər ... və ya qatı cüt vurun), düyməsini vurun Atributlar forması nişanı, sonra altında Ümumi silin Düzəliş edilə bilər və altında Varsayılanlar sahəsində Cari dəyər növümaksimum ("FID") + 1.

Silmədən Düzəliş edilə bilər, başqa bir dəyər daxil edə və ya orada olanı silə bilməzsən. Qeyd edək ki, şəxsiyyət vəsiqəsi olmayan dəyərlər varsa, bu dəyərlər yenilənməyəcəkdir. Bir nöqtədə yoxlama ilə sınaqdan keçirəcəyəm Yeniləmədə standart dəyəri tətbiq edin və yalnız bu qeydləri düzəldildikdə yeniləmək üçün bir sıfır və ya NULL dəyərini yoxlamaq üçün formulumu yenidən nəzərdən keçirirəm, dəyəri 1-dən böyük olmayan hər hansı bir qeyd yox. (Bu yazıda əvvəllər FID sahəsini unikal dəyərlərlə necə yeniləyəcəyimiz müzakirə edilmiş, Onsuz da shapefile xüsusiyyətləri olduqdan sonra sahəni əlavə etsəniz etməlisiniz.)

Diqqət yetirin ki, bu, shapefile deyil, cari xəritə faylı ilə qeyd olunur, buna görə də shapefile bir neçə dəfə əlavə etmək, qat üslubunun həmin hissəsini yeni əlavə edilmiş təbəqəyə kopyalamağınızı tələb edəcəkdir. Bunu etmək üçün qatı sağ vurun, seçin Stillər> Kopyalama Stili> Sahələrvə başqa bir təbəqəyə sağ vurun, seçin Stillər> Stil Yapışdır> Bütün Stil kateqoriyası (və ya davam edin Sahələr). Ayrıca üslubun bu hissəsini bir shapefile əsaslanan başqa bir təbəqəyə kopyalaya bilərsiniz, ancaq şəxsiyyət vəsiqəsi sahəsi kopyaladığınız təbəqə ilə eyni ada sahib olmalıdır.


Vinayan'ın yazısına əlavə etmək və qısaca qeyd etmək istəyirəm rownum funksiyası, çox oxşardığı üçün və bəzi hallarda bir az daha rahat ola bilər.

id qaytarır Xüsusiyyət ID, yəni həmişə başlayır sıfır.
rownum qaytarır sıra nömrəsi, yəni başladığı mənasını verir bir.

Beləliklə, əsasən avtomatik artımın 0 go-də başlamasını istəyirsinizsə $ idvə 1-də başlamasını istəyirsinizsə, keçin $ rownum.


QGIS 3 üçün yeniləmə

Buna çox gec gəldiyimi bilirəm, amma yeniləmələri vermək hər zaman yaxşıdır:

QGIS 3-də bu işi dəqiq yerinə yetirmək üçün istifadə edilə bilən yerli bir vasitə var və buna "Autoincremental alan əlavə et" deyilir.

Sahə kalkulyatorunda bir ifadə istifadə etməyə və ya hər hansı bir kodlaşdırmaya ehtiyac yoxdur, lakin bunların hamısı hələ çox faydalı və bilmək üçün yaxşıdır.


Bu mövzu gündəmə gəldi: QGIS-də avtomatik artım əsas açarı ilə Shapefile yaradın

Təkliflərim belə olacaq:

1) SQLITE / SpatialLite verilənlər bazaları İNTEGER İLK ANAHTAR olaraq təyin edilmiş bir sahədə avtomatik artırmağı dəstəkləyir:

Bir INSERT-də, ROWID və ya INTEGER PRIMARY KEY sütununa açıq bir şəkildə bir dəyər verilmirsə, avtomatik olaraq istifadə olunmamış bir tam rəqəmlə doldurulur, ümumiyyətlə hazırda istifadə olunan ən böyük ROWID-dən çoxdur. Bu AUTOINCREMENT açar sözünün istifadə edilib edilməməsindən asılı olmayaraq doğrudur.

Çoxbucaqlıları hər dəfə düzəltdiyiniz / yaratdığınız zaman onların xüsusiyyətlərini doldura bilərsiniz və SQLITE, INTEGER PRIMARY KEY tipinə təyin etdiyiniz sahədə artan bir unikal dəyər verəcəkdir.

GEOJSON-a ixrac etməyə hazır olduğunuzda, UNİKAL ID-lərinizlə hazırsınız.

2) Shapefiles istifadə edirsinizsə, INTEGER tipli bir OBJECTID sahəsi yaradın və hər poliqonları düzəltdiyiniz / yaratdığınız və ixrac etməyiniz lazım olan hər dəfə bu sahəni doldurmaq üçün bir sahə kalkulyatoru ifadəsini istifadə edin. Bir dəfə çoxbucaqlı olan orijinal identifikatoru itirəcəksiniz, ancaq .SHP istifadə edərək buna nail olmağın yeganə yolu budur. (Sahə kalkulyatoru ifadəsini tapmaq məcburiyyətində qalacağam).

PostGIS, araşdırmaq istədiyiniz başqa bir məlumat mənbəyidir, baxmayaraq ki, SQLITE-dən daha çox ağır bir lift, irəlilədikcə belə bir sistemdə dəyər tapa bilərsiniz ...


Köhnə yazı, lakin sürətli bir həll axtaran hər kəs üçün $ ID + 1 ilə bir sahə yaratmaq idi və avtomatik olaraq 1 ilə başlayacaq!


İnsan tərəfindən həzm edilə bilən bir şeyə ehtiyacınız yoxdursa, indi asan bir düzəliş var: Sahə mülkiyyətində "UUID Generator" u seçin və hər şeyi boş qoyun.

Bu avtomatik olaraq sahədə bir UUID yaradacaqdır. Sadə bir nömrə qədər dost deyil ($ id və ya $ rownum-a uyğun olaraq), lakin başlanğıcdan UUID yaradır, buna görə ardıcıl addımlar yoxdur.


yalnız ilk colmn (id) silmək və yenisini yarada bilərsiniz "Virtual field as"


Sadəcə olaraq sənədləri kopyalayın və bir CSV surəti yaradın və yenidən OID-lər yaradaraq göstərin və yeni shapefile və ya xüsusiyyət sinfi şəklində ixrac edin.


bu həllər artıq QGIS 2.01 Dufour-da mənim üçün işləmir. Yazmaq$ id'id' adlı yeni və ya mövcud bir sahədə ifadə daxilində mənə bir səhv verdi "İfadə etibarsızdır"

İş funksiyanı yazmaq idi$ rownumvə sonra "Tamam" düyməsini basın


Bunun ən asan yolu, ehtimal ki, bir piton skriptində ola bilər və ya bəlkə də sahə kalkulyatoru ilə mümkündür. Bağışlayın ki, sizin üçün biri yoxdur, bəlkə başqası olacaq. Bu vaxt bunun üçün bir piton skriptini axtarardım. ArcGIS üçün bu barədə çox şey görmüşəm, amma əminəm ki, QGIS üçün bir şey var.


MYSQL-də Avtomatik artım problemi

JOB_NAME, SANDBOX, PARENT_JOB_NAME-nı əsas açar və JOB_ID-i avtomatik artım olaraq saxlamaq istəyirəm, çünki "ON DUPLICATE KEY UPDATE" istifadə edirəm və avtomatik artım sayəsində cədvəldə yeni sətirlər əlavə edir və təkrarlanır.

Və job_id əsas açardan çıxararkən. "Kimi səhv edirəmSəhv cədvəl tərifi yalnız bir avtomatik sütun ola bilər və bir açar kimi təyin olunmalıdır"


17 Cavablar 17

Zəmanətli unikal sıra identifikatoruna sahib olmaq heç vaxt pis bir fikir deyil. Heç vaxt & ndash deməməli olduğumu düşünürəm, amma gəlin əksəriyyəti ilə yaxşı bir fikirdir.

Nəzəri potensialın mənfi cəhətləri arasında qorumaq üçün əlavə bir indeks və istifadə olunan əlavə saxlama sahəsi var. Bu heç bir səbəbi istifadə etməməyim üçün kifayət deyildi.

TLDR: Hər satırı müəyyənləşdirmək üçün özünəməxsus bir yolunuz yoxdursa, avtomatik artım əvəzinə UUID istifadə edin.

Əvvəlki bütün cavablarla razılaşmıram. Bütün cədvəllərə avtomatik artım sahəsi əlavə etməyin pis bir fikir olmasının bir çox səbəbi var.

Açıq açarların olmadığı bir cədvəliniz varsa, avtomatik artım sahəsi yaxşı bir fikir kimi görünür. Axı, bədən = '[10000 simvol sətri]' olduğu blogdan * seçmək istəmirsiniz. Daha yaxşı * harada olacağını blogdan seçin. Bu halların əksəriyyətində həqiqətən istədiyiniz şeyin ardıcıl unikal identifikator deyil, unikal bir identifikator olduğunu mübahisə edərdim. Yəqin ki, bunun əvəzinə ümumdünya bənzərsiz bir identifikator istifadə etmək istəyirsiniz.

Əksər verilənlər bazalarında təsadüfi unikal identifikatorlar yaratmaq funksiyaları mövcuddur (uuid mysql, postgres. Newid mssql). Bunlar, istənilən vaxt müxtəlif maşınlarda, aralarında heç bir şəbəkə bağlantısı olmadan birdən çox verilənlər bazasına məlumat yaratmağa imkan verir və yenə də sıfır ziddiyyətlərlə məlumatları birləşdirir. Bu, çoxsaylı serverləri və hətta məlumat mərkəzlərini, məsələn, mikroservislərlə daha asan qurma imkanı verir.

Bu, həm də təcavüzkarların url-lərin daxil olmamalı olduqları səhifələri təxmin etməsindən qaçınır. Bir https://example.com/user/1263 varsa, ehtimal ki bir https://example.com/user/1262 də var. Bu, istifadəçi profil səhifəsindəki bir təhlükəsizlik istismarının avtomatlaşdırılmasına imkan verə bilər.

Bir uuid sütununun faydasız və ya hətta zərərli olduğu bir çox hal var. Deyək ki, sosial şəbəkəniz var. Bir istifadəçi masası və bir dost masası var. Dostlar cədvəlində iki istifadəçi sütunu və avtomatik artım sahəsi var. 3-ün 5-lə dost olmasını istəyirsən, buna görə 3,5-ü verilənlər bazasına əlavə edirsən. Verilənlər bazası avtomatik artım id əlavə edir və 1,3,5 saxlayır. Nə isə, istifadəçi 3 & quotadd dostu & quot; düyməsini yenidən vurur. Yenidən verilənlər bazasına 3,5 əlavə edirsiniz, verilənlər bazası avtomatik artım id əlavə edir və 2,3,5 əlavə edir. Ancaq indi 3 və 5 iki dəfə bir-birləri ilə dost oldular! Bu boş yerə boş yerə sərf etməkdir və bu barədə düşünsəniz, avtomatik artım sütunu da. A və b-nin dost olub olmadığını görmək üçün lazım olan hər şey bu iki dəyərlə satır seçməkdir. Bunlar birlikdə, bənzərsiz bir sıra identifikatorudur. (Çox güman ki, 3,5 və 5,3-ün təkrarlandığından əmin olmaq üçün bir məntiq yazmaq istərdiniz.)

Hələ də ardıcıl id-lərin faydalı ola biləcəyi, url qısaldıcı qurarkən olduğu kimi hallar var, lakin əksəriyyəti (və hətta url qısaldıcısı ilə birlikdə) təsadüfi olaraq yaradılan unikal id, bunun əvəzinə istifadə etmək istədiyiniz şeydir.

Autoincemental açarları əsasən üstünlüklərə malikdir.

Ancaq bəzi mümkün çatışmazlıqlar ola bilər:

  • Bir iş açarınız varsa, ticarət qaydalarını tətbiq etmək üçün həmin sütun (lar) a da unikal bir indeks əlavə etməlisiniz.
  • İki verilənlər bazası arasında məlumat ötürərkən, xüsusən də məlumatlar birdən çox cədvəldə olduqda (yəni master / detal), düz deyil, çünki ardıcıllıqlar verilənlər bazaları arasında sinxronlaşdırılmır və ilk istifadə edərək bir bərabərlik cədvəli yaratmalısınız. mənşə verilənlər bazasından hansı identifikatorun hədəf verilənlər bazasında hansı kimliklə uyğun gəldiyini bilmək üçün uyğun iş açarı. Buna baxmayaraq, məlumatları təcrid olunmuş cədvəllərdən / sənədlərə ötürərkən problem olmamalıdır.
  • Bir çox müəssisədə müvəqqəti, qrafik, nöqtə ilə vur, sürüklə və burax hesabatlandırma vasitələri mövcuddur. Autoincremental ID-lər mənasız olduğundan, bu tip istifadəçilər məlumatı xaricində anlamağa və tətbiqdən & quot-a çıxmaqda çətinlik çəkəcəklər.
  • Təsadüfən iş açarını dəyişdirsəniz, bu cərgəni heç vaxt bərpa edə bilməyəcəksiniz, çünki artıq insanlar tərəfindən müəyyənləşdiriləcək bir şeyiniz yoxdur. Bu bir dəfə BitCoin platformasında bir arızaya səbəb oldu.
  • Bəzi dizaynerlər iki cədvəl arasındakı birləşdirmə masasına şəxsiyyət vəsiqəsi əlavə edirlər, bu zaman PK sadəcə iki xarici şəxsiyyətdən ibarət olmalıdır. Aydındır ki, birləşdirmə cədvəli üç və ya daha çox cədvəl arasındadırsa, avtomatik bir identifikatorun mənası var, ancaq iş qaydalarını tətbiq etmək üçün FK-lərin birləşməsinə tətbiq edildikdə unikal bir açar əlavə etməlisiniz.

Təqdimedici açarların mənfi cəhətləri haqqında bir Wikipedia məqaləsi.

Tam əksinə, Xeyr, hər zaman ədədi bir AutoInc PK-yə ehtiyacınız YOXDUR.

Verilərinizi diqqətlə təhlil edirsinizsə, məlumatdakı təbii açarları tez-tez müəyyənləşdirirsiniz. Bu, məlumatların iş üçün daxili bir mənası olduqda tez-tez olur. Bəzən PK-lar, iş istifadəçilərinin sistemlərinin xüsusiyyətlərini təsvir etmək üçün ikinci bir dil olaraq istifadə etdikləri qədim sistemlərdən olan əsərlərdir. Məsələn, bir donanma idarəetmə sistemində "Nəqliyyat vasitəsi" cədvəlinin əsas açarı kimi istifadə olunan avtomobilin VIN nömrələrini gördüm.

Ancaq mənşəyi, əgər artıq bənzərsiz bir identifikatorunuz varsa, istifadə edin. İsraf etdiyi və səhvlərə səbəb ola biləcəyi ikinci, mənasız bir əsas açar yaratmayın.

Bəzən bir müştəri üçün mənalı bir dəyər yaratmaq üçün AutoInc PK istifadə edə bilərsiniz. Siyasət nömrələri. Başlanğıc dəyərinin həssas bir şeyə qoyulması və aparıcı sıfırlara dair iş qaydalarının tətbiq edilməsi. Bu, yəqin ki, "hər iki dünyanın ən yaxşısı" yanaşmasıdır.

Nisbətən statik olan az sayda dəyəriniz olduqda sistem istifadəçisi üçün mənalı dəyərlərdən istifadə edin. L, C, H istifadə edə bildiyiniz zaman L, H və C-nin sığortanın "Siyasət növü" kontekstində Həyatı, Maşını və Evi təmsil etdiyi və ya VIN nümunəsinə qayıtdıqda "TO" nu istifadə etdiyiniz zaman 1,2,3-dən istifadə etməli "Toyota üçün? Bütün Toyata avtomobillərində "TO" ilə başlayan bir VIN var, istifadəçilərin xatırlamaları daha az şeydir, proqramlaşdırma və istifadəçi səhvlərini təqdim etmələrini daha az ehtimal edir və hətta hesabatları daha asanlaşdıran rəhbərlik hesabatlarında tam təsvir üçün istifadə edilə bilən bir vəkil ola bilər. yazmaq və bəlkə də daha sürətli yaratmaq.

Bunun daha bir inkişafı bəlkə də "çox körpüdür" və ümumiyyətlə tövsiyə etmirəm, amma tamlığı üçün əlavə edirəm və bunun üçün yaxşı bir istifadə tapa bilərsiniz. Yəni təsviri əsas açar olaraq istifadə edin. Sürətlə dəyişən məlumatlar üçün bu iyrənc bir şeydir. Üçün çox statik məlumatlar bildirilir Hər zaman, bəlkə də yox. Sadəcə bunu qeyd etmək üçün bir ehtimal olaraq orada oturmaq.

AutoInc PK-lərini istifadə edirəm, sadəcə beynimi məşğul edirəm və əvvəlcə daha yaxşı alternativlər axtarıram. Verilənlər bazası dizaynı sənədi tez bir zamanda soruşula bilən mənalı bir şey edir. Çox sayda qoşulma buna mane olur.

EDİT Avtomatik Yaratılmış PK-ya ehtiyacınız olmadığı digər vacib bir hal, digər iki cədvəlin kəsişməsini təmsil edən masalardır. Avtomobil bənzərliyinə sadiq qalmaq üçün bir avtomobildə 0..n aksesuar var, hər bir aksessuara bir çox avtomobildə rast gəlmək olar. Buna görə təmsil etmək üçün Avtomobil və Aksesuar PK-lərini və keçid tarixləri və s. İlə əlaqəli digər məlumatları ehtiva edən bir Car_Accessory cədvəli yaradırsınız.

Ehtiyacınız olmayan (ümumiyyətlə) bu masadakı bir AutoInc PK-dır - ona yalnız "bu maşında hansı aksesuarların olduğunu deyin" və ya Aksesuar vasitəsi ilə "hansı avtomobillərdə bu aksessuarı olduğunu söyləyin" vasitəsi ilə daxil olacaq.

Bir çox masada onsuz da təbii unikal bir id var. Bu cədvəllərə başqa bir unikal id sütunu (avtomatik artım və ya başqa) əlavə etməyin. Bunun əvəzinə təbii unikal id istifadə edin. Başqa bir unikal id əlavə etsəniz, əsas etibarilə məlumatlarınızda bir çoxluq (təkrarlama və ya asılılıq) var. Bu normallaşma prinsiplərinə ziddir. Bir unikal id doğruluğuna görə digərinə bağlıdır. Bu o deməkdir ki, onlar mükəmməl şəkildə sinxronlaşdırılmalıdır hər dəfə in hər sistem bu sıraları idarə edən. Bu, uzun müddətə idarə etmək və doğrulamaq istəmədiyiniz məlumat bütövlüyünüzdəki başqa bir kövrəklikdir.

Bu günlərdə əksər cədvəllər əlavə bir unikal id sütununun verə biləcəyi çox kiçik bir performans artımına ehtiyac duymur (və bəzən hətta performansı azaldır). İT-də ümumi bir qayda olaraq, kimi ixtisarlardan çəkinin vəba! Sizə təklif olunan hər yerdə buna qarşı durun. Bu anatemadır. Və sitata diqqət yetirin. Hər şey mümkün qədər sadə olmalıdır, lakin daha sadə olmamalıdır. Təbii biri daha az səliqəli görünsə də, birinin yetərli olduğu iki unikal identifikatorunuz yoxdur.

Daha böyük sistemlərdə ID uyğunluq artırıcıdır, istifadə edin təxminən hər yerdə. Bu kontekstdə fərdi birincil düymələr tövsiyə olunmur, alt hissədə bahalıdır (niyə oxuyun).

Hər qaydanın bir istisnası var, bu səbəbdən ixrac / idxal üçün istifadə edilən səhnə cədvəllərində və bənzər birtərəfli cədvəllərdə və ya müvəqqəti cədvəllərdə tamsaylı avtomatik böyümə identifikatoruna ehtiyac olmaya bilər. Ayrıca paylanmış sistemlərdə şəxsiyyət vəsiqələri əvəzinə GUID-lərə üstünlük verəcəksiniz.

Buradakı bir çox cavab mövcud unikal açarın götürülməsini təklif edir. Yaxşı 150 simvol olsa belə? Mən belə düşünmürəm.

İndi əsas məqam:

Autoincrement integer ID-nin əleyhdarları 20 cədvələ qədər kiçik verilənlər bazaları haqqında danışırlar. Orada hər masaya fərdi yanaşma imkanı var.

AMMA 400-dən çox cədvəlli bir ERP-yə sahib olduqda, hər yerdə tam avtomatik düzəldici ID-yə sahibsiniz (yuxarıda göstərilən hallar istisna olmaqla) yalnız böyük bir məna daşıyır. Özünəməxsusluğu mövcud və təmin edilmiş olsa da, digər unikal sahələrə etibar etmirsiniz.

  • Universal vaxta qənaət edən, səylərə qənaət edən və yadda saxlanması asan olan konvensiyadan faydalanırsınız.
  • Əksər hallarda düymələrin nə olduğunu yoxlamadan cədvəllərə QOŞULursunuz.
  • Tamsayı autoincrement sütununuzla işləyən universal kod qaydalarına sahib ola bilərsiniz.
  • Sadəcə mövcud cədvəllərin ID-lərinə istinad edərək əvvəlcədən gözlənilməyən yeni cədvəllər və ya istifadəçi plaginləri ilə sisteminizi genişləndirə bilərsiniz. Artıq əvvəldən var, əlavə olaraq əlavə etmək üçün heç bir xərc yoxdur.

Daha böyük sistemlərdə, bu fərdi birincil açarların kiçik faydalarını görməməyə dəyər və əksər hallarda ardıcıl olaraq tam avtomatik düzəldici ID istifadə edin. Mövcud unikal sahələri birincil açarlar kimi istifadə etmək bəlkə də qeydlər üçün bəzi baytlara qənaət etməkdir, lakin əlavə yaddaş və ya indeksləmə vaxtı yaradır problem yoxdur bugünkü verilənlər bazası mühərriklərində. Əslində inkişaf etdiricilərin / qulluqçuların boş vaxtlarına görə daha çox pul və resurs itirirsiniz. Bugünkü proqram təminatçıları vaxt və səy üçün optimallaşdırılmalıdır - ardıcıl ID ilə yanaşma daha yaxşı nəticə verir.

Artıq dizayn etmək yaxşı bir təcrübə deyil. Yəni - ehtiyac olmadığı zaman hər zaman avtomatik artım int əsas düyməsinə sahib olmaq yaxşı təcrübə deyil.

Birinə ehtiyac olmadığı bir nümunəyə baxaq.

Məqalələr üçün bir cədvəliniz var - bunun bir əsas açarı var id və adlı varchar sütunu başlıq .

Məqalə kateqoriyalarından ibarət bir cədvəliniz var - id int əsas açar, varchar adı.

Məqalələr cədvəlindəki bir sıra bir id 5 və a başlıq "Qazı kərə yağı ilə necə bişirmək olar". Bu məqaləni Kateqoriyalar cədvəlindəki aşağıdakı sətirlərlə əlaqələndirmək istəyirsiniz: "Quş" (id: 20), "Qaz" (id: 12), "Pişirmə" (id: 2), "Kərə yağı" (id: 9).

İndi 2 cədvəliniz var: məqalələr və kateqoriyalar. İkisi arasındakı əlaqəni necə yaradırsınız?

3 sütundan ibarət bir cədvəliniz ola bilər: id (ilkin açar), article_id (xarici açar), kateqoriya_id (xarici açar). Ancaq indi belə bir şey var:

Daha yaxşı bir həll, 2 sütundan ibarət olan əsas bir açara sahib olmaqdır.

Bunu etməklə həyata keçirilə bilər:

Avtomatik artım tam ədədi istifadə etməməyin başqa bir səbəbi, əsas açarınız üçün UUID istifadə edirsinizsə.

UUID-lər öz təriflərinə görə unikaldırlar ki, bu da bənzərsiz tamsayılardan eyni şeyi yerinə yetirir. Tam ədədlər üzərində öz əlavə üstünlükləri (və mənfi cəhətləri) var. Məsələn, bir UUID ilə istinad etdiyiniz unikal sətrin müəyyən bir məlumat qeydinə işarə etdiyini bilirsiniz ki, bu, 1 mərkəzi verilənlər bazasına sahib olmadığınız və ya tətbiqlərin offline qeydlər yaratmaq qabiliyyətinə malik olduqları hallarda faydalıdır ( sonra onları daha sonra bir verilənlər bazasına yükləyin).

Sonda birincil düymələri bir şey kimi düşünməməlisiniz. Onları yerinə yetirən funksiya kimi düşünməlisiniz. Niyə əsas açarlara ehtiyacınız var? Gələcəkdə dəyişdirilməyəcək bir sahədən istifadə edərək cədvəldən xüsusi məlumat dəstlərini unikal şəkildə təyin edə bilmək. Bunu etmək üçün id adlı müəyyən bir sütuna ehtiyacınız var və ya bu unikal identifikasiyanı digər (dəyişməz) məlumatların əsasına bağlaya bilərsinizmi?

Yoxsa belə bir sahə əlavə etmək istəmədiyiniz ssenarilər varmı?

Hər şeydən əvvəl, heç bir avtomatik düzəltmə olmayan verilənlər bazaları var (məsələn, ətrafdakı ən kiçik iddiaçılardan biri olmayan Oracle). Bu, hamının bəyənmədiyi və ya ehtiyac duymadığının ilk göstəricisi olmalıdır.

Daha da əhəmiyyətlisi, şəxsiyyət vəsiqəsinin əslində nə olduğunu düşünün edir - məlumatlarınız üçün əsas bir açardır. Fərqli bir əsas açarı olan bir cədvəliniz varsa, şəxsiyyət vəsiqəsinə ehtiyacınız yoxdur və olmamalısınız. Məsələn, bir cədvəldə (EMPLOYEE_ID, TEAM_ID) (hər bir işçinin eyni vaxtda bir neçə komandada ola biləcəyi) bu iki şəxsiyyətdən ibarət aydın şəkildə təyin olunmuş bir əsas açarı vardır. Bu cədvəl üçün də əsas açar olan bir avtokrement şəxsiyyəti sütunu əlavə etmək heç bir məna vermir. İndi ətrafınızda 2 əsas açar var və "əsas düymə" dəki ilk söz sizə yalnız birinə sahib olduğunuza dair bir ipucu verməlidir.

Ümumiyyətlə, "uzunömürlü" məlumatlar üçün yeni cədvəllər təyin edərkən "şəxsiyyət" sütunundan (avtomatik artan tam ədəd) istifadə edirəm (bir dəfə əlavə edib bir az sahə qoyaraq "məntiqi olaraq silinsələr də" sonsuza qədər davam etməyi gözlədiyim qeydlər) ).

Bunları istifadə etmək istəmədiyiniz zaman düşünə biləcəyim bir neçə vəziyyət var, bunların əksəriyyəti DB-nin bir nümunəsindəki bir cədvəlin yeni ID dəyərləri üçün səlahiyyətli mənbə ola bilməyəcəyi ssenarilərə qədər qaynar:

  • Artan şəxsiyyətlər potensial bir təcavüzkar üçün çox məlumat olacağı zaman. "Xalqa yönəlmiş" məlumat xidmətləri üçün bir şəxsiyyət sütununun istifadəsi, qeyd id 10234 varsa, "Alman Tank Problemi" qarşısında həssas olmağınıza səbəb olaraq qeydin 10233, 10232, və s. Mövcud olduğunu, ən azı 10001 qeydinə və sonra şəxsiyyət sütununun harada başladığını anlamaq üçün 1001, 101 və 1 qeydlərini yoxlamaq asandır. Əsasən təsadüfi məlumatlardan ibarət olan V4 GUID-lər bu artan davranışı dizaynına görə pozur, belə ki, yalnız bir GUID mövcud olduğu üçün GUID-in bir baytını artırmaq və ya azaltmaqla yaradılan bir GUID mütləq mövcud deyil və təcavüzkarın xidmətdən istifadə etməsini çətinləşdirir. bir zibil aracı olaraq tək qeyd alma üçün. Erişimi daha yaxşı məhdudlaşdıra biləcək digər təhlükəsizlik tədbirləri var, lakin bu kömək edir.
  • M: M çapraz istinad cədvəllərində. Bu bir növ gimme, amma bunu əvvəllər də görmüşəm. Verilənlər bazanızdakı iki cədvəl arasında birdən çoxa münasibətiniz varsa, go-to həll hər cədvəlin PK-yə istinad edən xarici açar sütunları ehtiva edən bir çarpaz istinad cədvəlidir. Bu cədvəlin PK-si daxili indeks davranışını əldə etmək və istinadların özünəməxsusluğunu təmin etmək üçün demək olar ki, həmişə iki xarici açarın birləşmə açarı olmalıdır.
  • Bu masaya toplu şəkildə daxil edib silməyi planlaşdırdığınız zaman. Yəqin ki, şəxsiyyət sütunları üçün ən böyük dezavantaj, orijinal cədvəlin əsas dəyərlərini qorumaq istədiyiniz başqa bir cədvəldən və ya sorğudan bir sıra əlavə edərkən keçməli olduğunuz əlavə hoopla. "Şəxsiyyət daxiletməsini" açmalısınız (bununla belə DBMS-də aparılır), sonra əlavə etdiyiniz düymələrin unikal olduğundan əmin olun və sonra idxal ilə işiniz bitdikdə şəxsiyyət sayğacını quraşdırmalısınız. cədvəlin maksimum dəyərinə metadatası. Bu əməliyyat bu masada çox olarsa, fərqli bir PK sxemini nəzərdən keçirin.
  • Paylanmış masalar üçün. Kimlik sütunları, bir verilənlər bazası nümunəsinin istənilən vaxt bütün məlumat şeması üzərində yeganə səlahiyyət sahibi olduğu tək nümunəli verilənlər bazaları, boşalma cütləri və digər ssenarilər üçün əla işləyir. Bununla birlikdə, gedə biləcəyiniz çox böyük bir şey var və hələ də bir kompüteriniz kifayət qədər sürətli olsun. Replikasiya və ya əməliyyat jurnalının göndərilməsi sizə əlavə yalnız oxunan nüsxələr əldə edə bilər, lakin bu həll miqyasında da bir məhdudiyyət var. Gec-tez məlumat daxiletmələrini idarə edən və sonra bir-biri ilə sinxronizasiya edən iki və ya daha çox server nümunəsinə ehtiyacınız olacaq. Bu vəziyyət gəldikdə, artan bir sahə əvəzinə bir GUID sahəsi istəyəcəksiniz, çünki əksər DBMS-lər yaradıldıqları GUID-lərin bir hissəsini nümunə üçün müəyyən bir identifikator kimi istifadə etmək üçün əvvəlcədən konfiqurasiya edilmiş olur, sonra identifikatorun qalan hissəsini təsadüfi olaraq yaradır və ya tədricən. Hər iki halda da, iki GUID generatoru arasında toqquşma ehtimalı sıfırdır, şəxsiyyət tamsayı sütunu bu vəziyyətdə idarə etmək üçün bir kabus olsa da (toxumları əvəzləşdirərək artımı 2-yə qoyaraq cüt / tək gedə bilərsiniz, ancaq bir server varsa şəxsiyyət vəsiqələrini boşa verdiyiniz digərindən daha çox fəaliyyət görür).
  • DB-dəki bir çox cədvəldə unikallığı tətbiq etmək məcburiyyətində qaldıqda. Məsələn mühasibat sistemlərində, məsələn, Baş Mühasibat kitabını (indiyə qədər baş verən hər hesabın hər bir krediti və ya debeti üçün bir sıra ilə, buna görə çox tez böyüyür) idarə etmək ümumi bir şeydir. il Görünüşlər daha sonra hesabat vermək üçün onları birləşdirmək üçün yaradıla bilər. Məntiqi olaraq, bunların hamısı çox böyük bir masadır, lakin onu parçalamaq DB-nin texniki işlərini asanlaşdırır. Bununla birlikdə, birdən çox cədvələ daxiletmələri necə idarə etmək problemini təqdim edir (növbəti ayda giriş əməliyyatları, sonuncunu bağlayarkən girişə başlamağınıza imkan verir) təkrarlanan düymələrlə bitmədən. Yenidən şəxsiyyət tamsayı sütunları əvəzinə GUID'lər go-to həllidir, çünki DBMS bunları həqiqətən bənzərsiz bir şəkildə yaratmaq üçün nəzərdə tutulmuşdur, beləliklə bütün DBMS-də tək bir GUID dəyəri bir dəfə görünəcəkdir.

Ümid etdiyim kimi qeyd etdiyim kimi bu hallarda şəxsiyyət sütunlarından istifadə etməyə imkan verən keçid yolları var, lakin bunların əksəriyyətində şəxsiyyət tam sütunundan GUID-ə yüksəltmək daha asandır və problemi tamamilə həll edir.

Avtomatik artan (şəxsiyyət) əsas açar, verilənlər bazası və həmin verilənlər bazasının dərhal müştəriləri kontekstindən kənarda mənasız olduğunu qeyd etmək xaricində yaxşı bir fikirdir. Məsələn, bəzi məlumatları başqa bir verilənlər bazasında köçürsəniz və saxlasanız, hər iki verilənlər bazası cədvəlinə fərqli məlumatlar yazmağa davam edin, idlər fərqlənəcək - yəni bir verilənlər bazasında 42 id olan məlumatlar mütləq məlumatlarla uyğun gəlməyəcəkdir digərində 42 nömrəli id.

Bunu nəzərə alaraq, hələ də verilənlər bazasından xaricində misilsiz olaraq (və tez-tez olduğu kimi) satırları müəyyənləşdirmək lazımdırsa, bu məqsəd üçün fərqli bir açara sahib olmalısınız. Diqqətlə seçilmiş bir iş açarı edəcək, ancaq tez-tez özünəməxsusluğu təmin etmək üçün tələb olunan çox sayda sütun mövqeyində qalacaqsınız. Digər bir üsul, dünyanın hər yerində mövcud olduğu sətri unikal şəkildə müəyyənləşdirmək məqsədi ilə bir Id sütununa avtomatik artım yığılmış birincil açar və başqa bir unikal identifikator (bələdçi) sütununa qruplaşdırılmamış unikal açar kimi sahib olmaqdır. Bu halda hələ avtomatik artırılmış açarın olmasının səbəbi, avtomatik artırma düyməsini klaslaşdırmaq və indeksləşdirmək bir bələdçiyə eyni şeyi etməkdən daha səmərəlidir.

Avtomatik artırma düyməsini istəməməyiniz üçün bir vəziyyət, birincil açarın digər iki cədvəlin İd sütunlarının birləşməsindən ibarət olduğu çoxdan çoxlu bir cədvəl ola bilər (burada hələ avtomatik artırma açarı ola bilər, amma mən bunun mənasını görmürəm).

Digər suallardan biri avtomatik artan açarın məlumat növüdür. Int32-dən istifadə etmək sizə böyük, lakin nisbətən məhdud dəyərlər verir. Şəxsən mən Id üçün tez-tez bigint sütunlarından istifadə edirəm, demək olar ki, heç vaxt dəyərlərim tükənməkdən narahat olmağım üçün.

Digər insanlar artan birincil açar üçün vəziyyət yaratdıqları üçün bir GUID üçün bir açar edəcəyəm:

  • Bənzərsiz olmasına zəmanət verilir
  • Tətbiqinizdəki məlumatlar üçün verilənlər bazasına bir dəfə daha az səyahət edə bilərsiniz. (Məsələn, bir cədvəl üçün GUID-i tətbiqdə saxlaya və qeydləri götürmək üçün istifadə edə bilərsiniz. Bir şəxsiyyət istifadə edirsinizsə, verilənlər bazasını adla soruşmalısınız və PK almaq üçün bunu edən bir çox tətbiq gördüm və sonra daha ətraflı məlumat almaq üçün yenidən sorğu edir).
  • Məlumatları gizlətmək üçün faydalıdır. www.domain.com/Article/2 Yalnız iki məqaləniz olduğunu bildirin, www.domain.com/article/b08a91c5-67fc-449f-8a50-ffdf2403444a mənə heç nə demir.
  • Fərqli verilənlər bazalarındakı qeydləri asanlıqla birləşdirə bilərsiniz.
  • MSFT şəxsiyyət üçün GUIDS istifadə edir.

Yaxşı bir dizayn prinsipi olaraq, hər cədvəl bir sıra misilsiz bir şəkildə müəyyənləşdirmək üçün etibarlı bir yola sahib olmalıdır. Birincil açarın bunun üçün olmasına baxmayaraq, həmişə bir əsas açarın mövcudluğunu tələb etmir. Hər bir cədvələ əsas açar əlavə etmək pis bir təcrübə deyil, çünki bənzərsiz bir sıra identifikasiyası təmin edir, lakin lazımsız ola bilər.

İki və ya daha çox cədvəl sıraları arasında etibarlı əlaqələri qorumaq üçün bunu xarici düymələr vasitəsilə etməlisiniz, buna görə ən azı bəzi cədvəllərdə əsas düymələrə ehtiyacınız var. Hər cədvələ bir əsas açar əlavə etmək, mövcud məlumatlara yeni cədvəllər və ya əlaqələr əlavə etmək vaxtı gəldikdə verilənlər bazası dizaynını genişləndirməyi asanlaşdırır. Planlaşdırma həmişə yaxşı bir şeydir.

Əsas prinsip olaraq (bəlkə də sərt qayda) birincil açarın dəyəri sıra sırası boyunca heç vaxt dəyişməməlidir. Ardıcıl olan hər hansı bir iş məlumatının ömrü boyu dəyişə biləcəyini düşünmək ağıllıdır, buna görə hər hansı bir iş məlumatı əsas açar üçün zəif bir namizəd olacaqdır. Bu səbəbdən avtomatik artan bir tam kimi mücərrəd bir şey çox vaxt yaxşı bir fikirdir. Bununla birlikdə, avtomatik artan tam ədədlərin məhdudiyyətləri var.

Veriləriniz yalnız verilənlər bazanızda bir ömrə sahib olacaqsa, avtomatik artan tam ədədlər yaxşıdır. Ancaq digər cavablarda da qeyd edildiyi kimi, məlumatlarınızın paylaşılmasını, sinxronlaşdırılmasını və ya başqa bir şəkildə verilənlər bazanızdan kənar bir həyat yaşamağını istəyirsinizsə, avtomatik artan tam ədədlər zəif birincil açarları meydana gətirir. Daha yaxşı seçim bir bələdçi olacaq (aka uuid "universal unikal id").

Sual və cavabların çoxu, hər masa üçün bütün təbii düymələrin yalnız içərisində yerləşməsinin vacib məqamını əldən verir məntiqi şema verilənlər bazası üçün və hər cədvəl üçün bütün vəkil düymələri yalnız fiziki sxem verilənlər bazası üçün. digər cavablarda, əvəzedici düymələrin düzgün istifadə olunma səbəblərini və nə vaxt istifadə etmədiklərini, yalnız GUID əvəzedici düymələrə qarşı tam ədədin nisbi faydaları müzakirə olunur.

BTW: Yalnış müəyyən edilmiş və dəqiq olmayan müddətin istifadəsindən çəkinək əsas açar. Əvvəlcə əlaqəli modeldə birlikdə seçilmiş (ağılsızca), daha sonra müxtəlif RDBMS satıcıları tərəfindən yenidən fiziki alana yenidən qoşulmuş əvvəlcədən əlaqəli məlumat modellərinin bir əsəri. İstifadəsi yalnız semantikanı qarışdırmağa xidmət edir.

- dən qeyd əlaqəli model verilənlər bazası üçün məntiqi şema içində olmaq ilk normal forma, hər masa bir olmalıdır istifadəçi tərəfindən görünən sahələr dəsti təbii açar, cədvəlin hər sətrini özünəməxsus şəkildə müəyyənləşdirir. Əksər hallarda belə bir təbii açar asanlıqla müəyyənləşdirilir, ancaq bəzən a kimi qurulmalıdır qalstuk kəsici sahə və ya başqa şəkildə. Lakin belə bir qurulmuş açar hər zaman istifadəçi tərəfindən görünür və beləliklə daima məntiqi şema verilənlər bazası.

Əksinə hər hansı surroqat açar bir masada sırf fiziki sxem verilənlər bazası üçün (və beləliklə həm təhlükəsizlik səbəbləri və həm də verilənlər bazası bütövlüyünün qorunması üçün hər zaman verilənlər bazası istifadəçiləri üçün tamamilə görünməməlidir). Təqdim etmək üçün yeganə səbəb a surroqat açar performans məsələlərini həll etməkdir fiziki baxım və istifadə bunların birləşdirilməsi, təkrarlanması, məlumat üçün birdən çox təchizat mənbəyi və ya digərlərinin olması DB-nin.

Vəkil açarının təqdim edilməsinin yeganə səbəbi performans olduğundan, gəlin onun ifaçı olmasını istədiyimizi düşünək. Əldə olan performans məsələsi birləşdirilirsə, mütləq surroqat açarımızı ola biləcəyi qədər darlaşdırmaq istəyirik (aparata mane olmadan, ümumiyyətlə qısa tam ədədlər və baytlar xaricindədir). Qoşulma performansı minimum indeks hündürlüyünə əsaslanır, buna görə 4 baytlıq tam bir təbii həlldir. Performans probleminiz giriş sürətidirsə, 4 baytlıq bir tam ədədi də təbii bir həll ola bilər (RDBMS-in daxili hissələrindən asılı olaraq). Bir cədvəl üçün performans probleminiz digərlərindən daha çox və ya birdən çox məlumat mənbəyidirsə surroqat açar texnologiya, istər bir GUID olsun, istər iki hissəli bir açar (Host ID + integer) daha uyğun ola bilər. Şəxsən mən GUID-lərin sevimlisi deyiləm, amma əlverişlidirlər.

Xülasə etmək üçün bütün cədvəllər a tələb etməyəcəkdir surroqat açar (istənilən növdə) bunlar yalnız nəzərdən keçirilən cədvəlin icrası üçün zəruri hesab edildikdə istifadə olunmalıdır. Hansı ümumi olmasından asılı olmayaraq surroqat açar Tercih etdiyiniz texnologiyanı dəyişdirərək bir seçim etmədən əvvəl cədvəlin həqiqi ehtiyaclarını yaxşı düşünün surroqat açar bir masa üçün texnologiya seçimi yorucu bir iş olacaq. Cədvəliniz üçün əsas performans metrikasını sənədləşdirin ki, varisləriniz seçimləri başa düşsünlər.

Xüsusi hallar

Əgər iş tələbləriniz bu sahədən daha çox audit (və ya digər) məqsədlər üçün əməliyyatların ardıcıl nömrələnməsini tələb edirsə yox vəkil bir açar təbii açar (əlavə tələblərlə). Sənədlərdən avtomatik artan bir tam ədəd yalnız yaradır surroqat açarları, buna görə onu yaratmaq üçün başqa bir mexanizm tapın. Obviously some sort of monitor will be necessary, and if you are sourcing your transactions from multiple sites then one site will be special, by virtue of being the designated host site for the monitor.

If your table will never be more than about a hundred rows then index height is irrelevant every access will be by a table scan. However string comparisons on long strings will still be much more expensive than comparison of a 4-byte integer, and more expensive than comparison of a GUID.

A table of kod values keyed by a char(4) kod field should be as performant as one with a 4-byte integer. Although I have no proof of this I use the assumption frequently and have never had reason to rue it.


Creating a table with auto-incrementing IDs in a SQL query

If you’re starting from scratch, you’ll need to create a table in your database that’s set up to auto-increment its primary keys.

➞ PostgreSQL

When creating an auto-incremented primary key in Postgres, you’ll need to use SERIAL to generate sequential unique IDs. Default start and increment are set to 1.

When applied to our example inventory data set, table creation looks like:

This first step is pretty straightforward. Just be sure to mark your item number column as the PRIMARY KEY .

Auto-incrementing in MySQL is pretty similar to SQL Server, except you don’t manually include the starting value and integer value. Instead, you use the AUTO_INCREMENT keyword, which has a default start and increment value of 1.

The basic syntax for creating this table in MySQL is:

In our example, here’s the table we’d want to create:

Like Postgres, you need to make sure that you’re using the PRIMARY KEY keyword for the column you want to generate your unique IDs from.

➞ SQL Server

In SQL Server, you’ll use the IDENTITY keyword to set your primary key (or item_number in our use case). By default, the starting value of IDENTITY is 1, and it will increment by 1 with each new entry unless you tell it otherwise.

To start, create a table. The basic syntax:

When applied to our inventory test case, table creation will look like:

Again—one last time—make sure to include PRIMARY KEY next to the SERIAL keyword, so you’re not just generating a useless list of sequential numbers.

Now, once you’ve created the framework of your table, you’ll need to decide if the default starting and increment values make sense for your use case.

Subscribe to the Retool monthly newsletter
Once a month we send out top stories (like this one) along with Retool tutorials, templates, and product releases.


6 Cavablar 6

You could use a CAML query and sort by the particular field, grab the highest value and add one. Should probably have a distinct check as well.

The query can be something like this :

I don't think your approach or the idea of performing a CAML query would work (. at least not consistently), primarily due to your inability to natively manage concurrency. It would be challenging enough to handle it in a single WFE environment, but if you have multiple WFEs you would most assuredly have multiple instances of an event receiver or query executing at the same time, returning the same "last ID" value and then all setting their LogIDNumber property to the same last+1 value.

I suppose you could create an ID list with one column (LogIDNumber), make it a Number type, and make sure Enforce unique values = Yes. You can then add an item to that list in your event receiver and if it chokes then you know another EV instance got there first and you need to requery the last ID until the insert into the ID list doesn't choke. If it doesn't choke then your EV instance owns the ID and can safely update the LogIDNumber property for that list item.

Can I ask what requirement(s) are causing you to create your own auto-icrement column versus using ID?


I had a similar issue, I solved it and since this comes up high on Google for what I was looking for it may help others.

I migrated several Wordpress databases from AWS RDS MySQL to MySQL running on an EC2 instance, using the database migration service. What I didn't know is it doesn't copy indexes, keys, auto increment, or really anything other than the basics. Of course the best approach would be to dump the database using mysqldump and import it manually, but one Wordpress install had significant changes and I didn't want to redo them. Instead I manually recreated the auto_increment values and indexes.

I've documented how I fixed Wordpress auto increment here on my website, here's a copy of what worked for me. It's possible I'll make further changes, I'll update the website but I may not remember to update this question.

  • You should check your tables and make sure to set your auto_increment to a value that makes sense for that table.
  • If you get the error “alter table causes auto_increment resequencing resulting in duplicate entry 1” (or 0, or something else). This is usually fixed by deleting the entry with the ID 0 or 1 in the table. Note that you should be careful doing this as it could delete an important row.

Why did this happen? Here's what went wrong for me:

If you exported your database using phpadmin and had an error on reimporting it, the code that adds the primary key doesn't run because it's at the end of the SQL file, not at its creation.

Before I figured this out, I updated to the phpmyadmin 5 beta and it imported the files with the key even though I still had the error.

Lesson one is, don't let your import crash, even if your tables are there. Mine crashed on table that began with wp_w so it came after user and rekt my auto increments.

If you look at the bottom of your SQL export, you will find the alter table for adding the Primary Key and the auto increment.

You don't need to specify the auto increment it automatically knows what the next increment is like so:

If you had admin activity since this happened, you have zeros in your key field, which will not allow you to set a primary key, and without that, you can't auto increment. So you need to run a delete script vs each table like so:

Here's a complete set of updates If your table has these, it will throw and error.


4 Cavablar 4

Tim, I had faced the same issue where I needed to restart the identity to the next value. I was using db2v9.1.

Unfortunately, there is no way to specify the next value automatically. As per DB2 documentation the value should be a 'numeric constant'. Hence I had to do a select max(id), get the value and replace it in the alter..restart stmt manually.

I don't remember if I tried this - but you can write an sp where max(id) is set in a variable and assign the variable in the alter. restart stmt. (I am unable to try as I dont hav access to any db2 database anymore). I doubt it'll work though. (If it works do let me know :))

DB2 reference:

RESTART or RESTART WITH numeric-constant

Resets the state of the sequence associated with the identity column. If WITH numeric-constant is not specified, the sequence for the identity column is restarted at the value that was specified, either implicitly or explicitly, as the starting value when the identity column was originally created. The column must exist in the specified table (SQLSTATE 42703), and must already be defined with the IDENTITY attribute (SQLSTATE 42837). RESTART does not change the original START WITH value.

The numeric-constant is an exact numeric constant that can be any positive or negative value that could be assigned to this column (SQLSTATE 42815), without non-zero digits existing to the right of the decimal point (SQLSTATE 428FA). The numeric-constant will be used as the next value for the column.


Frequently, we happen to need to fill tables with unique identifiers. Naturally, the first example of such identifiers is PRIMARY KEY data. These are usually integer values hidden from the user since their specific values are unimportant.

When adding a row to a table, you need to take this new key value from somewhere. You can set up your own process of generating a new identifier, but MySQL comes to the aid of the user with the AUTO_INCREMENT column setting. It is set as a column attribute and allows you to generate unique integer identifiers. As an example, consider the users table, the primary key includes an id column of type INT:

Inserting a NULL value into the id field leads to the generation of a unique value inserting 0 value is also possible unless the NO_AUTO_VALUE_ON_ZERO Server SQL Mode is enabled::

It is possible to omit the id sütun. The same result is obtained with:

The selection will provide the following result:

Select from users table shown in dbForge Studio

You can get the automatically generated value using the LAST_INSERT_ID() session function. This value can be used to insert a new row into a related table.

There are aspects to consider when using AUTO_INCREMENT, here are some:

  • In the case of rollback of a data insertion transaction, no data will be added to a table. However, the AUTO_INCREMENT counter will increase, and the next time you insert a row in the table, holes will appear in the table.
  • In the case of multiple data inserts with a single INSERT command, the LAST_INSERT_ID() function will return an automatically generated value for the first row.
  • The problem with the AUTO_INCREMENT counter value is described in Bug #199 – Innodb autoincrement stats los on restart.

For example, let’s consider several cases of using AUTO_INCREMENT for table1 :

Qeyd: The next AUTO_INCREMENT value for the table can be parsed from the SHOW CREATE TABLE result or read from the AUTO_INCREMENT field of the INFORMATION_SCHEMA TABLES table.

The rarer case is when the primary key is surrogate — it consists of two columns. The MyISAM engine has an interesting solution that provides the possibility of generating values for such keys. Let’s consider the example:

It is quite a convenient solution:

Special values auto generation

The possibilities of the AUTO_INCREMENT attribute are limited because it can be used only for generating simple integer values. But what about complex identifier values? For example, depending on the date/time or [A0001, A0002, B0150…]). To be sure, such values should not be used in primary keys, but they might be used for some auxiliary identifiers.

The generation of such unique values can be automated, but it will be necessary to write code for such purposes. We can use the BEFORE INSERT trigger to perform the actions we need.

Let’s consider a simple example. We have the sensors table for sensors registration. Each sensor in the table has its own name, location, and type: 1 –analog, 2 –discrete, 3 –valve. Moreover, each sensor should be marked with a unique label like [symbolic representation of the sensor type + a unique 4-digit number] where the symbolic representation corresponds to such values [AN, DS, VL].

In our case, it is necessary to form values like these [DS0001, DS0002…] and insert them into the etiket sütun.

When the trigger is executed, it is necessary to understand if any sensors of this type exist in the table. It is enough to assign number “1” to the first sensor of a certain type when it is added to the table.

In case such sensors already exist, it is necessary to find the maximum value of the identifier in this group and form a new one by incrementing the value by 1. Naturally, it is necessary to take into account that the label should start with the desired symbol and the number should be 4-digit.


3 Cavablar 3

Why are you creating something that SharePoint already does?

You can use the SharePoint default column ID in Workflows (as mentioned in the comments of the blogpost you refer to)

ID gets assigned sonra a New Item is created, so you can not use it in Calculated Column Formulas.

But Workflows are executed after the List Item is created so you can use ID in your workflow.

Only drawback might be, ID can not easily be reset, it will always increment

My new workflow is here here is working perfectly for me.

Event Handler approach can be used also for Autonumbering if you are in programming but I haven't tested it!

I'm trying to think of an alternate solution, but it seems you'll need to use a set of If conditions in the solution - that's if you want the preceding 000 prior to the ID value.

The workflow checks if the ID or the Next Number variable is within a certain range, and then append CaseOPT and the correct number of zeroes prior to the ID value.

Edit: The workflow would look something like this:

This is using the format "CaseOPT####" as the unique id.

I've arranged it this way assuming most of your entries will be in the 1000 - 100 range. Rearrange it depending on how much items you expect and how fast your list grows.


1 Cavab 1

I read that uuid does not bring any security advantages

This entirely relative to a given context. So it's neither true or false.

Consider that right now the session id is encrypting the auto-increment id (no uuid is used). If someone manages to know how the session is encrypted, then he can impersonate all the users: encrypt "1" and set the value as sessionID, encrypts "2" and set the value as sessionID, etc.

Session identifiers work if they're long random pieces of information. They do not encode or encrypt any information, these tokens are used by the server to locate information pertaining the established session.

In a typical scenario, client A connects to server B for the first time. They have no information or session id at this point. Server generates a new session id and sends it to client. Potentially authentication occurs and some data is stored on the server pertaining that particular session. Every subsequent request from the client carries this identifier so that the server can match the data relevant to that particular client during this particular session. Notice the data is stored on the server, all the client does is issue requests of whatever kind and tack on the session identifier as a way to maintain state in a stateless system.

Simultaneously other clients are doing the same. The server can maintain multiple states since every client uses their own unique session identifier. If the sessions weren't random or easily guessable, then an attacker could calculate or guess them and hijack established sessions.

So a randomly generated UUID is no better or worse than a randomly generated session identifier for the same length of random data.


Is it good practice to keep 2 related tables (using auto_increment PK) to have the same Max of auto_increment ID when table1 got modified?

This question is about good design practice in programming.

Let see this example, we have 2 interrelated tables:

rID is auto_increment primary key & textID is foreign key

The relationship is that 1 rID will have 1 and only 1 textID but 1 textID can have a few rID .

So, when table1 got modification then table2 should be updated accordingly.

Ok, here is a fictitious example. You build a very complicated system. When you modify 1 record in table1, you need to keep track of the related record in table2. To keep track, you can do like this:

Option 1: When you modify a record in table1, you will try to modify a related record in table 2. This could be quite hard in term of programming expecially for a very very complicated system.

Option 2: instead of modifying a related record in table2, you decided to delete old record in table 2 & insert new one. This is easier for you to program.

For example, suppose you are using option2, then when you modify record 1,2,3. 100 in table1, the table2 will look like this:

This means the Maks of auto_increment IDs in table1 is still the same (100) but the Maks of auto_increment IDs in table2 already reached 200.

what if the user modify many times? if they do then the table2 may run out of records? we can use BigInt but that make the app run slower?

Note: If you spend time to program to modify records in table2 when table1 got modified then it will be very hard & thus it will be error prone. But if you just clear the old record & insert new records into table2 then it is much easy to program & thus your program is simpler & less error prone.

So, is it good practice to keep 2 related tables (using auto_increment PK) to have the same Max of auto_increment ID when table1 got modified?


Videoya baxın: Dynamic GIS Layers with QGIS and Spatial Databases (Oktyabr 2021).