Izmena postojeće kolone u identity kolonu
Objavljeno: 11-09-2014 | Autor: Žana (Jovana) Baćović | Kategorija: T-SQL
Ознаке: Identity
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:
CREATE TABLE dbo.TestKefalo (ID INT IDENTITY(1,1));
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:
CREATE TABLE dbo.AutoriPrivremena (AutorID INT IDENTITY(1,1) NOT NULL, Ime NVARCHAR (20), Prezime NVARCHAR (30), Nadimak NVARCHAR (20), CONSTRAINT PK_AutoriPrivremena PRIMARY KEY CLUSTERED (AutorID) );
Nakon toga se podaci prebace u novokreiranu tabelu, uz omogućavanje inserta u identity kolonu:
SET IDENTITY_INSERT dbo.AutoriPrivremena ON; GO INSERT INTO dbo.AutoriPrivremena (AutorID,Ime,Prezime,Nadimak) SELECT AutorID,Ime,Prezime,Nadimak FROM dbo.Autori; GO SET IDENTITY_INSERT dbo.AutoriPrivremena OFF;
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.
ALTER TABLE dbo.CrtaniFilmovi_Rel_Autori DROP CONSTRAINT FK_CrtaniFilmovi_Rel_Autori_Autori; GO DROP TABLE dbo.Autori;
Preimenovaćemo tabelu AutoriPrivremena i tabelu Autori uz pomoć sp_rename procedure.
EXEC sp_rename 'AutoriPrivremena', 'Autori';
Za naš primjer je potrebno i vratiti spoljašnji ključ:
ALTER TABLE [dbo].[CrtaniFilmovi_Rel_Autori] WITH CHECK ADD CONSTRAINT [FK_CrtaniFilmovi_Rel_Autori_Autori] FOREIGN KEY([AutorID]) REFERENCES [dbo].[Autori] ([AutorID]); GO ALTER TABLE [dbo].[CrtaniFilmovi_Rel_Autori] CHECK CONSTRAINT [FK_CrtaniFilmovi_Rel_Autori_Autori];
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:
ALTER TABLE dbo.Autori SWITCH TO dbo.AutoriPrivremena;
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.
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.