Izmena postojeće kolone u identity kolonu

Objavljeno: 11-09-2014 | Autor: Žana (Jovana) Baćović | Kategorija: T-SQL

Ознаке:

0

Identity kolona predstavlja kolonu kojoj SQL Server automatski dodjeljuje vrijednost (broj) iz niza brojeva kojim je definisan. Taj niz je definisan početnom vrijednošću i inkrementom tj. vrijednošću za koju se početna vrijednost uvećava prilikom unosa novog reda.
Prilikom kreiranja tabele, sintaksa za kreiranje identity kolone je sledeća:

Prvi broj u IDENTITY(1,1) predstavlja početnu vrijednost a drugi broj vrijednost inkrementa.
Analogno se u tabeli dodaje identity kolona, naredbom ALTER TABLE ADD.

Ukoliko smo već kreirali kolonu koja nije identity a želimo da bude, onda to ne može da se uradi ALTER TABLE ALTER COLUMN naredbom, već na drugačiji način.
U dizajneru SSMS-a postoji opcija promjene identity osobine, ali ta akcija u pozadini radi kreiranje i brisanje tabele koje će biti opisano u a) primjeru. Na ovaj način kontrolu prepuštate dizajneru, a za velike tabele koje broje stotine miliona slogova je ovaj način neprihvatljiv sa stanovišta performansi.

Tabele sa malim brojem podataka

Uzećemo tabelu dbo.Autori iz SQL_KEFALO baze, koja nije velika i koja nema identity kolonu. Ako želimo da kolona AutorID postane identity, to može da se uradi na sledeći način:
a) Kreira se nova tabela koja ima iste kolone kao dbo.Autori, pri čemu se za kolonu AutorID postavi da je identity:

Nakon toga se podaci prebace u novokreiranu tabelu, uz omogućavanje inserta u identity kolonu:

Posle presipanja podataka, može da se obriše tabela dbo.Autori, kako bi mogla da se dbo.AutoriPrivremena preimenuje.
Pošto u našem primjeru tabela dbo.CrtaniFilmovi_Rel_Autori ima spoljašnji ključ na tabelu dbo.Autori, potrebno ga je obrisati i naknadno ponovo kreirati.

Preimenovaćemo tabelu AutoriPrivremena i tabelu Autori uz pomoć sp_rename procedure.

Za naš primjer je potrebno i vratiti spoljašnji ključ:

b) Ukoliko u identity kolonu ne moraju da se prepišu vrijednosti postojeće kolone već mogu da se zadaju vrijednosti kroz identity, onda bi drugi način bilo kreiranje nove kolone tipa identity u postojećoj tabeli.
Za tabelu dbo.Autori (kojoj vrijednosti u koloni AutorID počinju od 1001 pa dalje za 1 više) bi i za slučaj zadržavanja vrijednosti iz kolone AutorID vjerovatno bilo dovoljno da nova identity kolona ima početnu vrijednost 1001 i increment 1. Ne postoji garancija da će redosled biti kao u postojećoj, zavisi i od klastera. Nakon toga bi se obrisala kolona AutorID, a nova kolona preimenovala.

Tabele sa velikim brojem podataka

Ukoliko je tabela velika, navedene opcije će biti spore. U ovom slučaju je bolje primijeniti metodu zamjene metapodataka tabele, koristeći SWITCH naredbu.
Kreirajmo tabelu dbo.AutoriPrivremena kao u primjeru a).
Nakon toga je potrebno skloniti spoljašnji ključ na tabelu dbo.Autori a potom SWITCH naredbom izvršiti zamjenu metapodataka:

Izvršavanjem naredbi SELECT iz obje tabele, možete utvrditi da tabela dbo.Autori nema podataka i da se podaci nalaze u tabeli dbo.AutoriPrivremena.

SWITCH

Nakon toga može da se radi brisanje i preimenovanje, kao što je opisano u primjeru a).

Naredba ALTER TABLE SWITCH se uobičajeno koristi za particionisane tabele koje treba da zadovolje određene uslove, ali može i za neparticionisane kao u ovom slučaju.

Napišite komentar