Daugiau

Ar yra QGIS ID stulpelio automatinio padidinimo būdas


Aš kuriu išgalvotą žemėlapį, todėl man reikia sukurti daug taškų, linijų ir tikrai daugiakampių. Vėliau eksportuoju savo duomenis kaip geojsonas. Bet prieš tai aš turiu eiti ir kiekvienam elementui suteikti unikalų ID.

Man nereikia specialaus rūšiavimo, pavyzdžiui, didžiausias daugiakampis gauna mažiausią asmens tapatybės dokumentą. aš tik reikia visi daugiakampiai su an ID pabaigoje, be darymas tai rankiniu būdu kaip aš turiu daryti dabar.

Būtų puiku, jei kas nors žinotų, kaip tai padaryti.


Lauko skaičiuoklės naudojimas yra kelias:

ID nebuvo pateiktas

  1. Skaitmeninkite visas funkcijas neįvesdami jokio ID.
  2. Prieš eksportuodami naudokite lauko skaičiuoklę atnaujinkite unikalius ID su išraiška „$ Id“.

Kai kurie asmens dokumentai jau pateikti

  1. Jei jau turite ID, galite naudoti „- $ Id“. Įsitikinkite, kad tiesiog pasirinkote naujas funkcijas, o tai reiškia, kad ID eilutėje yra „NULL“. Paprasčiausiai atlikite tai užsakydami stulpelį.
  2. Dabar atlikite veiksmus iš paveikslėlių:


Aleliuja! Arba „Eureka“. Ar koks skirtumas. Tai galima padaryti. Su formefile.

  1. Jei jo dar nėra, pridėkite lauką, kuriame būtų funkcijos ID, sakykite „FID“ Visas skaičius (sveikas skaičius).
  2. Atviras Sluoksnio ypatybės (dešiniuoju pelės mygtuku spustelėkite sluoksnį ir pasirinkite Savybės ... arba dukart spustelėkite sluoksnį), spustelėkite Atributų forma skirtuką, tada - Generolas nuimkite žymėjimą Redaguoti ir pagal Numatytieji srityje Numatytoji reikšmė tipomaksimalus („FID“) + 1.

Atžymėdami Redaguoti, negalite įvesti kitos vertės ar ištrinti to, kas ten yra. Atminkite, kad jei yra reikšmių be ID, šios vertės nebus atnaujintos. Kažkuriuo metu eksperimentuosiu su tikrinimu Taikyti numatytąją reikšmę naujinant ir peržiūrėjau savo formulę, norėdama patikrinti, ar reikšmė nulis ar NULL yra atnaujinti tik tuos įrašus, kai jie yra redaguojami, o ne įrašus, kurių vertė yra didesnė nei 1. (Anksčiau šiame įraše buvo diskutuojama, kaip atnaujinti FID lauką unikaliomis reikšmėmis, kurį turėsite padaryti, jei lauką pridėjote po to, kai shapefile jau buvo funkcijų.)

Atminkite, kad tai išsaugoma kartu su dabartiniu žemėlapio failu, o ne su formefile, todėl pridėjus, kad shapefile kelis kartus reikės nukopijuoti tą sluoksnio stiliaus dalį į naujai pridėtą sluoksnį. Norėdami tai padaryti, dešiniuoju pelės mygtuku spustelėkite sluoksnį, pasirinkite Stiliai> Kopijuoti stilių> Laukaiir dešiniuoju pelės mygtuku spustelėkite kitą sluoksnį, pasirinkite Stiliai> Įklijuoti stilių> Visos stiliaus kategorijos (arba toliau Laukai). Taip pat galite nukopijuoti tą stiliaus dalį į bet kurį kitą sluoksnį, pagrįstą shapefile, tačiau ID laukas turi būti toks pat, kaip ir tas, iš kurio kopijuojate.


Norėčiau papildyti „vinayan“ įrašą ir trumpai paminėti rownum funkcija, nes ji yra labai panaši ir kai kuriais atvejais gali būti šiek tiek patogesnė.

id grąžina Funkcijos ID, tai reiškia, kad jis visada prasideda nuo nulis.
rownum grąžina eilutės numeris, tai reiškia, kad jis prasideda nuo vienas.

Taigi, jei norite, kad automatinis prieaugis prasidėtų nuo 0, eikite $ idir, jei norite, kad jis prasidėtų nuo 1, eikite $ rownum.


QGIS 3 naujinys

Žinau, kad gana vėluoju tai padaryti, bet visada gerai pateikti atnaujinimus:

„QGIS 3“ dabar yra tikrasis įrankis, kurį galima naudoti šiam tikslui atlikti, ir jis vadinamas „Pridėti automatinį lauką“

Nereikia naudoti lauko skaičiuoklės išraiškos ar koduoti, tačiau vis tiek tai yra labai naudinga ir gera žinoti.


Ši tema buvo čia: Sukurkite „Shapefile“ su pagrindiniu automatinio prieaugio raktu QGIS

Mano pasiūlymai būtų:

1) SQLITE / SpatialLite duomenų bazės palaiko automatinį didinimą lauke, nustatytame į INTEGER PRIMARY RAKTAS:

Jei INSERT stulpelyje ROWID arba INTEGER PRIMARY RAKTAS nėra aiškiai nurodyta reikšmė, jis bus automatiškai užpildytas nenaudojamu sveikuoju skaičiumi, paprastai tuo, kuris yra didesnis nei didžiausias šiuo metu naudojamas ROWID. Tai galioja neatsižvelgiant į tai, ar naudojamas AUTOINCREMENT raktinis žodis.

Kiekvieną kartą, kai redaguojate / kuriate daugiakampius, galite užpildyti jų atributus, o SQLITE suteiks jai unikalų prieaugį lauke, kurį nustatėte kaip INTEGER PRIMARY RAKTAS.

Kai būsite pasirengę eksportuoti į „GEOJSON“, jums bus nustatyti UNIKALŪS ID.

2) Jei naudojate „Shapefiles“, sukurkite INTEGER tipo OBJECTID lauką ir naudokite lauko skaičiuoklės išraišką, kad užpildytumėte tą lauką kiekvieną kartą, kai redaguojate / kuriate daugiakampius ir turite juos eksportuoti. Prarasite originalų ID, kurį kažkada turėjo daugiakampis, bet jūs tai vienintelis būdas tai pasiekti naudojant .SHP. (Turėsiu rasti lauko skaičiuoklės išraišką).

„PostGIS“ yra dar vienas duomenų šaltinis, kurį galbūt norėsite ištirti, nors daugiau sunkus nei SQLITE, tačiau judėdami į priekį, galite rasti tokios sistemos vertę ...


Senas įrašas, bet visiems kitiems, kurie ieško greito sprendimo, buvo sukurti lauką su $ ID + 1 ir jis automatiškai sugeneruos pradedant nuo 1!


Jei jums nereikia žmogaus virškinamų dalykų, dabar juos lengva išspręsti: Lauko savybėse pasirinkite „UUID generatorius“ ir palikite viską tuščią.

Tai automatiškai sukurs UUID lauke. Ne toks draugiškas, kaip paprastas skaičius (kaip už $ id ar $ rownum), tačiau UUID generuoja nuo pat pradžių, todėl nereikia atlikti nuoseklių žingsnių.


galite tiesiog ištrinti pirmąjį koloną (id) ir sukurti naują „Kaip virtualų lauką“


Tiesiog nukopijuokite failus ir sukurkite CSV kopiją ir vėl rodykite kurdami OID ir eksportuokite kaip naują shapefile ar funkcijų klasę.


šie sprendimai man nebetiko „QGIS 2.01 Dufour“. Rašyti$ idnaujo ar esamo lauko pavadinimu „id“ išraiškos įvesties lauke daviau klaidą „Išraiška neteisinga“

Tai, kas veikė, buvo įvesti funkciją$ rownumir tada spustelėkite „Gerai“


Paprasčiausias būdas tai padaryti tikriausiai būtų naudojant pitono scenarijų, o gal tai įmanoma naudojant lauko skaičiuoklę. Atsiprašau, kad neturiu jums vieno, galbūt kas nors kitas. Tuo tarpu aš ieškojau jo Python scenarijaus. Aš daug ką mačiau apie „ArcGIS“, bet esu tikras, kad yra kažkas, kas yra „QGIS“.


Automatinio prieaugio MYSQL problema

Noriu, kad „JOB_NAME“, „SANDBOX“, „PARENT_JOB_NAME“ būtų pagrindinis raktas, o „JOB_ID“ - kaip automatinis prieaugis, nes aš naudoju „ON DUPLICATE KEY UPDATE“ ir dėl automatinio prieaugio jis įterpia naujas eilutes ir kuria lentelės dublikatą.

Ir pašalindamas job_id iš pagrindinio rakto. Gaunu klaidą kaip „Netinkamas lentelės apibrėžimas gali būti tik vienas automatinis stulpelis ir jis turi būti apibrėžtas kaip raktas"


17 Atsakymai 17

Niekada nėra bloga mintis turėti garantuotą unikalų eilutės identifikatorių. Manau, neturėčiau sakyti niekada ir niekada, bet eikime su didžiąja dalimi laiko tai gera idėja.

Teorinio potencialo trūkumai apima papildomą indeksą palaikymui ir papildomą naudojamą saugojimo vietą. Tai man niekada nebuvo pakankama priežastis nenaudoti.

TLDR: Vietoj automatinio didinimo naudokite UUID, jei dar neturite unikalaus kiekvienos eilutės identifikavimo būdo.

Aš prieš tai nesutinku su visais atsakymais. Yra daugybė priežasčių, kodėl yra bloga idėja įtraukti automatinio prieaugio lauką į visas lenteles.

Jei turite lentelę, kurioje nėra akivaizdžių raktų, automatinio prieaugio laukas atrodo gera idėja. Galų gale nenorite pasirinkti * iš tinklaraščio, kuriame body = '[10000 simbolių eilutė]'. Verčiau pasirinkti * iš tinklaraščio, kur>. Manyčiau, kad daugeliu atvejų tai, ko jūs iš tikrųjų norite, yra unikalus identifikatorius, o ne nuoseklus unikalus identifikatorius. Jūs tikriausiai norite naudoti visuotinai unikalų identifikatorių.

Daugumoje duomenų bazių yra funkcijų, leidžiančių generuoti atsitiktinius unikalius identifikatorius (uuid „mysql“, „postgres“. „Newid“ - „mssql“). Tai leidžia jums bet kada generuoti duomenis į kelias duomenų bazes, skirtingose ​​mašinose, be jokio tinklo ryšio, ir vis tiek duomenis sujungti be jokių konfliktų. Tai leidžia lengviau sukonfigūruoti kelis serverius ir net duomenų centrus, pvz., Naudojant mikropaslaugas.

Tai taip pat vengia užpuolikų atspėti URL puslapiuose, prie kurių jie neturėtų turėti prieigos. Jei yra https://example.com/user/1263, tikriausiai taip pat yra https://example.com/user/1262. Tai gali leisti automatizuoti saugos išnaudojimą vartotojo profilio puslapyje.

Taip pat yra daug atvejų, kai naujid stulpelis yra nenaudingas ar net kenksmingas. Tarkime, kad turite socialinį tinklą. Yra vartotojų ir draugų stalas. Draugų lentelėje yra du „userid“ stulpeliai ir automatinio prieaugio laukas. Norite, kad 3 draugautų su 5, todėl į duomenų bazę įterpkite 3,5. Duomenų bazėje pridedamas automatinio prieaugio ID ir saugomi 1,3,5. Kažkaip 3 vartotojas dar kartą paspaudžia mygtuką & quot; pridėti draugą & quot; Vėl įterpiate 3,5 į duomenų bazę, duomenų bazė prideda automatinio prieaugio ID ir įterpia 2,3,5. Bet dabar 3 ir 5 draugauja tarpusavyje du kartus! Tai yra vietos švaistymas, o jei pagalvoji, tai yra ir automatinio prieaugio stulpelis. Viskas, ko reikia norint pamatyti, ar a ir b yra draugai, yra pasirinkti eilutę su tomis dviem reikšmėmis. Jie kartu yra unikalus eilutės identifikatorius. (Tikriausiai norėtumėte parašyti tam tikrą logiką, kad įsitikintumėte, jog 3,5 ir 5,3 yra išsklaidyti.)

Vis dar yra atvejų, kai nuoseklūs ID gali būti naudingi, pvz., Kuriant URL sutrumpintuvą, tačiau dažniausiai (ir net su URL trumpikliu) atsitiktinai sugeneruotas unikalus ID yra tai, ką iš tikrųjų norite naudoti.

Automatiniai klavišai turi daugiausia privalumų.

Tačiau kai kurie galimi trūkumai gali būti:

  • Jei turite verslo raktą, tame (-iuose) stulpelyje (-uose) taip pat turite pridėti unikalų indeksą, kad galėtumėte vykdyti verslo taisykles.
  • Perkeliant duomenis tarp dviejų duomenų bazių, ypač kai duomenys yra daugiau nei vienoje lentelėje (ty pagrindinėje / detalėje), tai nėra paprasta, nes sekos nėra sinchronizuojamos tarp duomenų bazių, todėl pirmiausia turėsite sukurti lygiavertiškumo lentelę. verslo raktą kaip atitikmenį, kad sužinotumėte, kuris ID iš kilmės duomenų bazės atitinka tą tikslinės duomenų bazės ID. Vis dėlto tai neturėtų kelti problemų perkeliant duomenis iš / į izoliuotas lenteles.
  • Daugelis įmonių turi ad-hoc, grafinius, „spustelėkite ir spustelėkite“, „vilkite ir upu“ ataskaitų teikimo įrankius. Kadangi automatiniai ID nėra beprasmiški, šio tipo vartotojams bus sunku suprasti, kokie duomenys nėra už programos „quot“.
  • Jei netyčia modifikuosite verslo raktą, tikėtina, kad tos eilutės niekada nebeatgausite, nes nebeturite ką žmonėms identifikuoti. Tai vieną kartą sukėlė „BitCoin“ platformos gedimą.
  • Kai kurie dizaineriai prideda ID prie sujungimo lentelės tarp dviejų lentelių, kai PK paprasčiausiai turėtų sudaryti du užsienio ID. Akivaizdu, kad jei prisijungimo lentelė yra tarp trijų ar daugiau lentelių, tuomet automatiškas ID yra prasmingas, bet tada turite pridėti unikalų raktą, kai jis taikomas FK deriniui vykdyti verslo taisykles.

Čia yra Vikipedijos straipsnių skyrius apie pakaitinių raktų trūkumus.

Kad būtų priešingai, ne, jums Nereikia visada turėti skaitinį „AutoInc“ PK.

Atidžiai analizuodami savo duomenis, tu dažnai identifikuoji natūralius raktus. Tai dažnai atsitinka, kai duomenys turi savo prasmę verslui. Kartais PK yra senovės sistemų artefaktai, kuriuos verslo vartotojai naudoja kaip antrą kalbą apibūdindami savo sistemos atributus. Aš mačiau transporto priemonių VIN numerius, naudojamus kaip pagrindinį „Transporto priemonės“ lentelės raktą, pavyzdžiui, transporto parko valdymo sistemoje.

Vis dėlto jis atsirado, JEI jau turite unikalų identifikatorių, naudokite jį. Nekurkite antro, beprasmio pirminio rakto, kuris yra švaistomas ir gali sukelti klaidų.

Kartais galite naudoti „AutoInc PK“, kad sukurtumėte reikšmingą kliento vertę, pvz. Politikos numeriai. Nustatyti pradinę vertę į protingą dalyką ir pritaikyti verslo taisykles dėl nulių skaičiaus ir tt Tai tikriausiai yra „geriausias iš abiejų pasaulių“ metodas.

Kai turite nedidelį skaičių santykinai statiškų verčių, naudokite reikšmes, kurios yra prasmingos sistemos vartotojui. Kodėl verta naudoti 1,2,3, kai galėtumėte naudoti L, C, H, kur L, H ir C reiškia „Gyvenimas, automobilis ir namai“ draudimo „poliso tipo“ kontekste, arba, grįžtant prie VIN pavyzdžio, kaip elgtis su „TO“ „Toyota“? Visuose „Toyata“ automobiliuose yra VIN, kuris pradeda „TO“. Tai yra mažiau dalykas, kurį vartotojai turi atsiminti, todėl rečiau jie įveda programavimo ir vartotojo klaidas ir netgi gali būti tinkamas viso aprašymo valdymo ataskaitose pakaitalas, todėl ataskaitos yra paprastesnės. rašyti ir galbūt greičiau sugeneruoti.

Tolesnė šio projekto plėtra tikriausiai yra „tiltas per toli“, ir aš jo paprastai nerekomenduoju, bet įtraukiu jį dėl išsamumo ir galite jį gerai naudoti. Tai yra, aprašą naudokite kaip pagrindinį raktą. Greitai besikeičiantiems duomenims tai yra bjaurybė. Dėl labai statiniai duomenys, apie kuriuos pranešama Visą laiką, o gal ir ne. Tiesiog pamini tai, kad sėdi kaip galimybė.

Aš naudoju „AutoInc“ PK, tiesiog užsiimu savo smegenimis ir pirmiausia ieškau geresnių alternatyvų. Duomenų bazės kūrimo menas sukuria ką nors prasmingo, į kurį galima greitai atsakyti. Per daug prisijungimų tai trukdo.

REDAGUOTI Kitas svarbus atvejis, kai nereikia automatiškai sugeneruoto PK, yra lentelių, kurios rodo dviejų kitų lentelių susikirtimą, atvejis. Norint laikytis automobilio analogijos, automobilyje yra 0..n priedų. Kiekvieną priedą galima rasti daugelyje automobilių. Taigi, norėdami tai atspindėti, sukursite „Car_Accessory“ lentelę, kurioje bus „Car and Accessory“ PK ir kita svarbi informacija apie nuorodą „Datos“ ir kt.

Ko jums (paprastai) nereikia, yra „AutoInc PK“ ant šios lentelės - prie jo bus galima patekti tik per automobilį „pasakyk man, kokie yra šio automobilio priedai“ arba iš priedo „pasakyk jiems, kokie automobiliai turi šį priedą“.

Daugelis lentelių jau turi natūralų unikalų ID. Prie šių lentelių nepridėkite kito unikalaus ID stulpelio (automatinio prieaugio ar kitokio). Vietoj to naudokite natūralų unikalų ID. Jei pridėsite kitą unikalų ID, iš esmės turėsite duomenų perteklių (dubliavimąsi arba priklausomybę). Tai prieštarauja normalizavimo principams. Vieno unikalaus ID tikslumas priklauso nuo kito. Tai reiškia, kad jie turi būti visiškai sinchronizuojami visais laikais į kiekviena sistema kad tvarko šias eilutes. Tai tik dar vienas jūsų duomenų vientisumo trūkumas, kurio tikrai nenorite valdyti ir tvirtinti ilgą laiką.

Daugumai šių dienų lentelių nereikia labai mažo našumo, kurį suteiktų papildomas unikalaus ID stulpelis (o kartais net sumenkina našumą). Kaip įprasta IT srityje, venkite atleidimo iš darbo kaip maras! Atsispirkite visur, kur jums siūloma. Tai anatema. Ir atkreipkite dėmesį į citatą. Viskas turėtų būti kuo paprastesnė, bet ne paprasčiau. Neturėkite dviejų unikalių ID, kur jų pakaks, net jei natūralusis atrodo mažiau tvarkingas.

Didesnėse sistemose ID yra nuoseklumo stiprintuvas, tačiau juo naudokitės beveik bet kur. Šiame kontekste atskiri pirminiai raktai Nerekomenduojami, jie apatinėje eilutėje yra brangūs (skaitykite kodėl).

Kiekvienoje taisyklėje yra išimtis, todėl jums gali neprireikti viso skaičiaus automatinio atpažinimo ID pakopinėse lentelėse, naudojamose eksportui / importui, ir panašiose vienpusėse lentelėse arba laikinose lentelėse. Jūs taip pat teikiate pirmenybę GUID vietoj ID paskirstytose sistemose.

Daugelis čia pateiktų atsakymų rodo, kad reikia pasiimti esamą unikalų raktą. Na, net jei jis turi 150 simbolių? Nemanau.

Dabar mano pagrindinis dalykas:

Panašu, kad automatinio įtraukimo sveikojo skaičiaus ID priešininkai kalba apie mažas duomenų bazes, kuriose yra iki 20 lentelių. Ten jie gali sau leisti individualų požiūrį į kiekvieną stalą.

BET, kai turėsite ERP su daugiau nei 400 lentelių, bet kurioje vietoje turėsite sveiko skaičiaus automatinio prieaugio ID (išskyrus aukščiau paminėtus atvejus) tiesiog turi didelę prasmę. Nepasikliaukite kitais unikaliais laukais, net jei jie yra ir yra apsaugoti dėl unikalumo.

  • Jums naudingas universalus laiko taupymas, pastangų taupymas, lengvai įsimenamas suvažiavimas.
  • Daugeliu atvejų jūs JUNGTI lenteles, netikrindami, kokie yra raktai.
  • Galite turėti universalaus kodo tvarką, veikiantį su sveikojo skaičiaus automatinio prieaugio stulpeliu.
  • Galite išplėsti savo sistemą naujomis lentelėmis ar vartotojo papildiniais, kurie anksčiau nebuvo numatyti, tiesiog nurodydami esamų lentelių ID. Jie jau yra nuo pat pradžių, jų papildomai pridėti nereikia.

Didesnėse sistemose gali būti verta nepaisyti nedidelių tų atskirų pagrindinių raktų privalumų ir daugeliu atvejų nuosekliai naudoti sveikojo skaičiaus automatinio prieaugio ID. Naudojant esamus unikalius laukus kaip pagrindinius raktus, galbūt sutaupoma keletas baitų kiekviename įraše, tačiau atsiranda papildoma saugojimo ar indeksavimo trukmė jokio klausimo šiandienos duomenų bazių varikliuose. Tiesą sakant, jūs prarandate daug daugiau pinigų ir išteklių sugaištam kūrėjų / prižiūrėtojų laikui. Šiandieninė programinė įranga turėtų būti optimizuota atsižvelgiant į laiko ir programuotojų pastangas - koks požiūris su nuosekliais ID atitinka daug geriau.

Tai nėra gera praktika nereikalingiems dizainams. T.y. - nėra gera praktika visada turėti automatinio prieaugio pirminį raktą, kai jo nereikia.

Pažiūrėkime pavyzdį, kai jo nereikia.

Jūs turite lentelę straipsniams - čia yra pagrindinis int raktas id ir varcharo stulpelis pavadintas pavadinimas .

Taip pat turite lentelę, kurioje pilna straipsnių kategorijų - pirminio pagrindinio rakto ID, „varchar“ pavadinimas.

Vienoje straipsnių lentelės eilutėje yra id iš 5 ir a pavadinimas „Kaip virti žąsį su sviestu“. Jūs norite susieti tą straipsnį su šiomis eilutėmis lentelėje Kategorijos: „Paukščiai“ (id: 20), „Žąsis“ (id: 12), „Maisto gaminimas“ (id: 2), „Sviestas“ (id: 9).

Dabar jūs turite 2 lenteles: straipsnius ir kategorijas. Kaip kuriate judviejų santykius?

Galite turėti lentelę su 3 stulpeliais: id (pagrindinis raktas), article_id (užsienio raktas), category_id (užsienio raktas). Bet dabar jūs turite kažką panašaus:

Geresnis sprendimas yra turėti pagrindinį raktą, kurį sudaro 2 stulpeliai.

Tai galima pasiekti:

Kita priežastis nenaudoti automatinio prieaugio skaičiaus yra ta, jei pagrindiniam raktui naudojate UUID.

Pagal savo apibrėžimą UUID yra unikalūs, o tai daro tą patį, ką daro unikalūs sveikieji skaičiai. Jie taip pat turi savo papildomų privalumų (ir trūkumų), palyginti su sveikaisiais skaičiais. Pvz., Turėdami UUID, žinote, kad unikali eilutė, į kurią kreipiatės, nurodo konkretų duomenų įrašą. Tai naudinga tais atvejais, kai neturite 1 centrinės duomenų bazės arba kai programos gali kurti duomenų įrašus neprisijungę ( vėliau vėliau įkelkite juos į duomenų bazę).

Galų gale nereikia galvoti apie pagrindinius raktus kaip apie dalyką. Jūs turite galvoti apie juos kaip apie funkciją, kurią jie atlieka. Kodėl jums reikalingi pagrindiniai raktai? Gebėti unikaliai identifikuoti konkrečius duomenų rinkinius iš lentelės naudojant lauką, kuris ateityje nebus pakeistas. Ar jums reikia tam tikro stulpelio, pavadinto id, ar galite pagrįsti šį unikalų identifikavimą pagal kitus (nekintamus) duomenis?

Arba yra scenarijų, kai nenorite pridėti tokio lauko?

Visų pirma, yra duomenų bazių, neturinčių jokio automatinio prieaugio (pvz., „Oracle“, kuris tikrai nėra vienas iš mažiausių varžovų). Tai turėtų būti pirmas požymis, kad ne visiems jie patinka ar reikalingi.

Dar svarbiau pagalvokite, koks iš tikrųjų yra asmens kodas yra - tai pagrindinis duomenų raktas. Jei turite lentelę su kitu pagrindiniu raktu, jums nereikia ID ir neturėtumėte jo turėti. Pavyzdžiui, lentelėje (EMPLOYEE_ID, TEAM_ID) (kur kiekvienas darbuotojas vienu metu gali būti keliose komandose) yra aiškiai apibrėžtas pagrindinis raktas, susidedantis iš tų dviejų ID. Pridėjus automatinio prieaugio ID stulpelį, kuris taip pat yra pagrindinis šios lentelės raktas, nebūtų prasmės. Dabar jūs vedate 2 pagrindinius raktus, o pirmasis žodis „pirminiame rakte“ turėtų suteikti jums užuominą, kad jūs tikrai turėtumėte turėti tik vieną.

Aš paprastai naudoju stulpelį „tapatybė“ (automatinis incremennting sveikasis skaičius) apibrėždamas naujas lenteles „ilgai gyvuojantiems“ duomenims (įrašams, kuriuos tikiuosi įterpti vieną kartą ir saugoti neribotą laiką, net jei jie bus „logiškai ištrinti“, nustatydami šiek tiek lauką ).

Yra keletas situacijų, apie kurias galiu pagalvoti, kai nenorite jų naudoti. Dažniausiai tai būna scenarijai, kai viena lentelė viename DB egzemplioriuje negali būti patikimas naujų ID reikšmių šaltinis:

  • Kai papildomi ID potencialiam užpuolikui bus per daug informacijos. Tapatybės stulpelio naudojimas „viešai prieinamoms“ duomenų paslaugoms daro jus pažeidžiamus „Vokietijos tankų problemos“, jei yra įrašo ID 10234, yra priežastis, kad yra įrašas 10233, 10232 ir kt., Bent jau iki įrašo 10001, ir tada lengva patikrinti 1001, 101 ir 1 įrašus, kad sužinotumėte, kur prasidėjo jūsų tapatybės stulpelis. V4 GUID, susidedantys iš daugiausia atsitiktinių duomenų, sulaužo šį papildomą elgesį pagal dizainą, todėl vien dėl to, kad yra vienas GUID, GUID, sukurtas padidinant arba sumažinant GUID baitą, nebūtinai egzistuoja, todėl užpuolikui yra sunkiau naudotis paslauga vieno įrašo paieškai kaip išmetimo įrankiui. Yra ir kitų saugumo priemonių, kurios gali geriau apriboti prieigą, tačiau tai padeda.
  • M: M kryžminių nuorodų lentelėse. Tai yra kažkoks gimnas, bet aš mačiau tai darant anksčiau. Jei jūsų duomenų bazėje yra daugybė lentelių tarp dviejų lentelių, pereinamasis sprendimas yra kryžminių nuorodų lentelė, kurioje yra užsienio raktų stulpeliai, nurodantys kiekvienos lentelės PK. Šios lentelės PK praktiškai visada turėtų būti sudėtinis dviejų užsienio raktų raktas, kad gautumėte integruotą indekso elgesį ir užtikrintumėte nuorodų unikalumą.
  • Kai planuojate į šią lentelę įterpti ir ištrinti daug. Ko gero, didžiausias tapatybės stulpelių trūkumas yra papildoma apyrankė, kurią turite patirti, kai įterpiate eilutes iš kitos lentelės ar užklausos, kur norite išlaikyti pagrindines lentelės reikšmes. Turite įjungti „tapatybės įterpimą“ (bet tai daroma jūsų DBVS), tada rankiniu būdu įsitikinkite, kad įterpiami raktai yra unikalūs, o kai baigsite importuoti, turite nustatyti tapatybės skaitiklį lentelės metaduomenis iki didžiausios esamos vertės. Jei ši operacija šioje lentelėje įvyksta daug, apsvarstykite kitą PK schemą.
  • Skirstomoms lentelėms. Tapatybės stulpeliai puikiai tinka vieno egzemplioriaus duomenų bazėms, perjungimo poroms ir kitiems scenarijams, kai viena duomenų bazės instancija yra vienintelė visos duomenų schemos institucija bet kuriuo metu. Tačiau yra tik toks didelis, kad galite eiti ir vis tiek turėti pakankamai greitą kompiuterį. Replikacijos ar operacijų žurnalo pristatymas gali suteikti jums papildomų tik skaitomų kopijų, tačiau to sprendimo mastas taip pat yra ribotas. Anksčiau ar vėliau jums reikės dviejų ar daugiau serverio egzempliorių, kurie tvarkys duomenų intarpus ir sinchronizuos tarpusavyje. Atsiradus tokiai situacijai, norėsite, kad GUID laukas būtų ne inkrementinis, nes dauguma DBVS yra iš anksto sukonfigūruoti naudoti dalį sukurtų GUID kaip konkretaus egzemplioriaus identifikatorių, tada likusį identifikatorių sugeneruos atsitiktinai arba palaipsniui. Bet kuriuo atveju dviejų GUID generatorių susidūrimo tikimybė yra lygi nuliui, o tapatybės sveikojo skaičiaus stulpelis yra košmaras, kurį reikia valdyti šioje situacijoje (galite lygiuotis / nelyginiai kompensuodami sėklas ir nustatydami prieaugį į 2, bet jei vienas serveris mato daugiau veiklos nei tas, kuriam švaistote ID).
  • Kai turite įgyvendinti unikalumą keliose DB lentelėse. Pavyzdžiui, apskaitos sistemose yra įprasta tvarkyti Didžiąją knygą (su eilute kiekvienam kada nors įvykusiam kreditui ar debetui, todėl ji labai greitai tampa labai didelė) kaip lentelių seką, kiekviena reprezentuojanti vieną kalendorinį mėnesį / metus. Tuomet galima sukurti peržiūras, kad jos būtų sujungtos ataskaitoms. Logiška, kad visa tai yra vienas labai didelis stalas, tačiau jo susmulkinimas palengvina DB priežiūros darbus. Tačiau jame pateikiama problema, kaip tvarkyti intarpus į kelias lenteles (tai leidžia jums pradėti registruoti operacijas kitą mėnesį, vis tiek uždarant paskutinę), nesibaigiant raktų dublikatais. Vėlgi, GUID, o ne sveiko skaičiaus stulpeliai, yra einamasis sprendimas, nes DBVS yra sukurta generuoti juos tikrai unikaliu būdu, todėl vienintelė GUID reikšmė bus matoma vieną kartą ir tik vieną kartą visoje DBVS.

Yra būdų, leidžiančių tokiose situacijose naudoti tapatybės stulpelius, kaip aš, tikiuosi, minėjau, tačiau daugumoje jų naujinimas iš stulpelio „Identity integer“ į GUID yra paprastesnis ir išsprendžia problemą išsamiau.

Automatiškai padidinamas (tapatybės) pagrindinis raktas yra gera idėja, išskyrus tai, kad jis yra beprasmis ne duomenų bazės kontekste ir tiesioginiams tos duomenų bazės klientams. Pvz., Jei perkeliate ir saugote dalį duomenų kitoje duomenų bazėje, tada rašykite skirtingus duomenis į abi duomenų bazės lenteles, identifikatoriai išsiskirs - ty duomenys, kurių ID yra 42 vienoje duomenų bazėje, nebūtinai sutaps su duomenimis kurio ID yra 42 kitoje.

Atsižvelgiant į tai, jei vis tiek reikia unikaliai nustatyti eilutes už duomenų bazės ribų (ir tai dažnai būna), šiam tikslui turite turėti kitą raktą. Tiks kruopščiai parinktas verslo raktas, tačiau dažnai atsidursite daugybėje stulpelių, reikalingų unikalumui garantuoti. Kitas būdas yra turėti stulpelį Id kaip automatinio prieaugio grupinį pirminį raktą, o kitą unikalaus identifikatoriaus (gido) stulpelį kaip nesublokuotą unikalų raktą, siekiant unikaliai identifikuoti eilutę, kad ir kur ji egzistuotų pasaulyje. Priežastis, kodėl šiuo atveju vis dar turite automatiškai padidintą raktą, yra ta, kad efektyviau klasterizuoti ir indeksuoti automatinio didinimo raktą, nei tą patį daryti vadovui.

Vienas atvejis, kai galbūt nenorite automatiškai didėjančio rakto, būtų lentelė „visi daugeliui“, kur pagrindinis raktas yra dviejų kitų lentelių „Id“ stulpelių junginys (čia vis tiek galite turėti automatinio didinimo raktą, bet aš nematau prasmės).

Kitas klausimas yra automatiškai padidinto rakto duomenų tipas. Naudojant „Int32“, gaunamas didelis, tačiau santykinai ribotas verčių diapazonas. Aš asmeniškai dažnai naudoju „bigint“ stulpelius ID, kad praktiškai niekada nereikėtų jaudintis dėl to, jog baigsis vertės.

Kadangi kiti žmonės pateikė pagrindinio rakto didinimo atvejį, aš jį sukursiu GUID:

  • Garantuojama, kad ji bus unikali
  • Programoje esančių duomenų duomenų bazėje galite apsilankyti viena mažiau. (Pavyzdžiui, tipų lentelėje galite išsaugoti GUID programoje ir naudoti ją įrašui gauti. Jei naudojate tapatybę, turite pateikti užklausą duomenų bazėje pagal pavadinimą ir mačiau daugybę programų, kurios tai daro, kad gautų PK ir vėliau dar kartą klausia, kad gautumėte išsamią informaciją).
  • Tai naudinga slėpti duomenis. www.domain.com/Article/2 Leiskite man žinoti, kad turite tik du straipsnius, o www.domain.com/article/b08a91c5-67fc-449f-8a50-ffdf2403444a man nieko nesako.
  • Įrašus iš skirtingų duomenų bazių galite lengvai sujungti.
  • MSFT naudoja GUIDS tapatybei nustatyti.

Kaip gero dizaino principas, kiekvienoje lentelėje turėtų būti patikimas būdas unikaliai identifikuoti eilutę. Nors tam ir reikalingas pagrindinis raktas, jis ne visada reikalauja pirminio rakto. Įtraukti pagrindinį raktą į kiekvieną lentelę nėra bloga praktika, nes tai suteikia unikalų eilučių identifikavimą, tačiau gali būti nereikalinga.

Norėdami palaikyti patikimus ryšius tarp dviejų ar daugiau lentelių eilučių, turite tai padaryti naudodami svetimus raktus, todėl bent kai kuriose lentelėse reikia pagrindinių raktų. Pridedant pagrindinį raktą prie kiekvienos lentelės, bus lengviau išplėsti duomenų bazės dizainą, kai ateis laikas pridėti naujų lentelių ar ryšių prie esamų duomenų. Planavimas iš anksto visada yra geras dalykas.

Kaip pagrindinis principas (galbūt griežta taisyklė), pagrindinio rakto vertė niekada neturėtų keistis per visą jo eilutės gyvenimą. Protinga manyti, kad visi verslo duomenys iš eilės gali keistis per visą jų gyvavimo laiką, todėl visi verslo duomenys bus prasti pirminio rakto kandidatai. Štai kodėl kažkas abstraktaus, pavyzdžiui, automatiškai didinamas sveikasis skaičius, dažnai yra gera idėja. Tačiau automatiškai didinami sveiki skaičiai turi savo apribojimus.

Jei jūsų duomenys gyvuos tik jūsų duomenų bazėje, automatiškai didinami sveiki skaičiai yra tinkami. Tačiau, kaip buvo minėta kituose atsakymuose, jei kada nors norite, kad jūsų duomenys būtų dalijamasi, sinchronizuojami ar kitaip gyvenate už duomenų bazės ribų, automatiškai didinami sveiki skaičiai sudaro prastus pirminius raktus. Geresnis pasirinkimas bus gidas (dar žinomas kaip „universalus unikalus ID“).

Klausimas ir daugelis atsakymų praleidžia svarbų dalyką, kad visi natūralūs kiekvienos lentelės raktai yra tik loginė schema duomenų bazei, o visi kiekvienos lentelės pakaitiniai raktai yra tik fizinė schema duomenų bazei. Kituose atsakymuose aptariami tik santykiniai sveikojo skaičiaus ir GUID pakaitinių raktų pranašumai, neaptariant priežasčių, kodėl pakaitiniai raktai naudojami tinkamai ir kada.

BTW: Venkime vartoti blogai apibrėžtą ir netikslų terminą pagrindinis raktas. Tai yra išankstinių reliacinių duomenų modelių artefaktas, kurį pirmiausia (neprotingai) pasirinko reliacinis modelis, o vėliau atgal į fizinę sritį pasirinko įvairūs RDBMS tiekėjai. Jo naudojimas tik painioja semantiką.

Pastaba iš santykių modelis kad siekiant duomenų bazės loginė schema Būti pirmoji normali forma, kiekvienoje lentelėje turi būti a vartotojui matomas laukų rinkinys, žinomas kaip a natūralus raktas, kad unikaliai identifikuoja kiekvieną lentelės eilutę. Daugeliu atvejų toks natūralus raktas yra lengvai atpažįstamas, tačiau kartais jis turi būti sukonstruotas, nesvarbu, ar jis yra kaklaraiščių pertraukiklis lauke ar kitaip. Tačiau toks sukonstruotas raktas vis dar yra matomas vartotojui, todėl visada yra loginė schema duomenų bazės.

Priešingai bet koks pakaitalas ant stalo gyvena vien tik fizinė schema duomenų bazei (taigi ir dėl saugumo, ir dėl duomenų bazės vientisumo palaikymo visada turi būti visiškai nematomas duomenų bazės vartotojams). Vienintelė priežastis įvesti a pakaitalas yra spręsti našumo problemas fizinė priežiūra ir naudojimas DB, nesvarbu, ar tai sujungimai, ar replikacija, ar keli duomenų aparatinės įrangos šaltiniai, ar kiti.

Kadangi vienintelė pakaitalo įvedimo priežastis yra atlikimas, tarkime, kad mes norime, kad jis būtų efektyvus. Jei nagrinėjama našumo problema, mes būtinai norime, kad pakaitinis raktas būtų kuo siauresnis (netrukdant aparatinei įrangai, todėl trumpi sveiki skaičiai ir baitai paprastai nėra). Prisijungimo našumas priklauso nuo minimalaus indekso aukščio, todėl 4 baitų sveikasis skaičius yra natūralus sprendimas. Jei jūsų našumo problema yra įterpimo dažnis, 4 baitų sveikasis skaičius taip pat gali būti natūralus sprendimas (atsižvelgiant į jūsų RDBMS vidinę dalį). Jei lentelės našumo problema yra replikacija arba keli duomenų šaltiniai nei kai kurie kiti pakaitalas gali būti tinkamesnė GUID ar dviejų dalių raktas (pagrindinio kompiuterio ID + sveikasis skaičius). Aš asmeniškai nesu mėgstamiausias GUID, bet jie yra patogūs.

Apibendrinant galima pasakyti, kad ne visose lentelėse reikės a pakaitalas (bet kokio tipo) jie turėtų būti naudojami tik tada, kai manoma, kad tai būtina nagrinėjamos lentelės veikimui. Nepriklausomai nuo to, kuris yra įprastas pakaitalas norimą technologiją, gerai apsvarstykite faktinius lentelės poreikius prieš pasirinkdami pakeisti pakaitalas technologijos pasirinkimas stalui bus varginantis darbas. Dokumentuokite pagrindinę lentelės našumo metriką, kad įpėdiniai suprastų pasirinkimus.

Ypatingos bylos

Jei jūsų verslo reikalavimai nurodo nuoseklų operacijų numeravimą audito (ar kitais) tikslais, nei tas laukas yra ne pakaitalas tai yra a natūralus raktas (su papildomais reikalavimais). Iš dokumentų generuojamas tik automatiškai didinantis sveikasis skaičius surogatiniai raktai, taigi raskite kitą mechanizmą, kad jį sugeneruotumėte. 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 kodas values keyed by a char(4) kodas 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 Answers 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 Answers 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 vartotojų 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 column. 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 :

Pastaba: 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. Mes galime naudoti 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 label column.

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 atsakymai 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 po to 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 Atsakymas 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?


Žiūrėti video įrašą: GIS Lesson 11: WMS. WMTS. WFS in QGIS (Rugsėjis 2021).