ĮTERPTI stulpelį su TAPATYBĖS rinkiniu
SQL serveryje yra ypatybė "IDENTITY", kuri automatiškai nustato nuoseklųjį skaičių iš 1 į konkretų stulpelį, kai įtraukiate įrašą. Pavyzdžiui, jei stulpelyje A nustatote TAPATYBĘ ir įtraukiate 3 įrašus, A stulpelyje automatiškai užpildomos 1, 2 ir 3 reikšmės tokia tvarka, kokia jas įtraukėte.
Net jei naudojate įterpimo sakinį, reikšmė nustatoma automatiškai, todėl nereikia aiškiai nustatyti reikšmės, tačiau manau, kad yra atvejų, kai norite aiškiai nustatyti reikšmę, nes ji naudojama išoriniam raktui ir pan.
Pavyzdžiui, tarkime, kad stulpelyje "ID" yra lentelė su ypatybe "IDENTITY", kaip parodyta paveikslėlyje.
Įterpimo sakinys, įterpiantis reikšmę į šią lentelę, įskaitant ID stulpelį, atrodytų taip:
insert into [テーブル名] ([ID], [Value]) values (1, 1)
Tačiau, kai bandau jį paleisti, manau, kad atsiras ši klaida.
Msg 544, 16 lygis, 1 valstija, 1 eilutė Kai IDENTITY_INSERT nustatytas į IŠJUNGTAs, aiškių reikšmių negalima įterpti į lentelės "XXXXX" tapatybės stulpelį.
Laikoma, kad stulpeliuose, kurie iš pradžių nustatyti kaip IDENTITY, reikšmės nustatomos automatiškai, todėl negalite aiškiai nustatyti reikšmių.
Jei tikrai norite jį nustatyti, turite nustatyti "IDENTITY_INSERT" į "ĮJUNGTA", kaip aprašyta klaidos pranešime. Prieš ĮTERPDAMI įjunkite IDENTITY_INSERT, o įJUNKITE, kai įterpimas bus baigtas, grįžkite į IŠJUNGTA, kaip nurodyta šiame SQL:
set identity_insert [テーブル名] on;
insert into [テーブル名] ([ID], [Value]) values (1, 1)
set identity_insert [テーブル名] off;
-- 確認
select * from [テーブル名];
Dabar galite aiškiai nustatyti reikšmę ir ją įterpti. INSERT-SELECT naudojant lenteles taip pat galioja.
Stulpeliams su IDENTITY automatiškai priskiriamos reikšmės iš 1, tačiau jei aiškiai nustatysite reikšmes, kaip aprašyta aukščiau, jums gali būti įdomu, koks skaičius bus priskirtas toliau. Tokiu atveju kita priskirta vertė priskiriama iš skaičiaus po didžiausios prie lentelės pridėtos reikšmės, todėl įterpiant naują įrašą nėra pasikartojančios reikšmės. (Tačiau yra išimčių dėl negalios ir pan.)