poniedziałek, 12 marca 2018

[PL] O właściwości IDENTITY w SQL Server 2014 SP2

Jeżeli podczas tworzenia tabeli w bazie danych określimy dla niej właściwość identity, to podczas wprowadzania danych do tabeli, wartość dla wiersza w tej kolumnie przyjmie narastającą wartość. Wartości w kolumnie z włączoną właściwością identity narastają co określoną wartość (określoną jako druga w nawiasie), zaczynając od wartości podanej jako pierwsza w nawiasie. Na przykład w poniższym przykładzie kolumna id będzie przyjmować wartości od 115 wzrastając o 20, czyli pierwszy wiersz otrzyma wartość 115, drugi 135, trzeci 155 itd.

USE tempdb;
go

CREATE TABLE [dbo].[test27072017] (

id int not null identity (115,20),
kolumna2 NVARCHAR(15),
kolumna3 NVARCHAR(15)
)

Dodajmy zatem kilka wierszy do utworzonej przed chwilą tabeli i sprawdźmy wynik

INSERT INTO [dbo].[test27072017] (kolumna2, kolumna3) VALUES (N'test1', N'test2');
INSERT INTO [dbo].[test27072017] (kolumna2, kolumna3) VALUES (N'test3', N'test4');
SELECT * FROM [dbo].[test27072017]

Jak widzimy pierwszy wiersz otrzymał wartość 115, kolejny 135.


Jeżeli chcielibyśmy przypisać wartość dla kolumny id z właściwością identity samodzielnie, otrzymamy błąd.

INSERT INTO [dbo].[test27072017] (id, kolumna2, kolumna3) VALUES (12, N'test3', N'test4');


Jeżeli chcielibyśmy umożliwić taką operację, należy włączyć opcję IDENTITY_INSERT w odniesieniu do bazy danych.

SET IDENTITY_INSERT [dbo].[test27072017] ON;

I wówczas system pozwoli na wprowadzenie do tabeli własnej wartości dla kolumny z właściwością identity.



Aby z powrotem wyłączyć taką możliwość, należy skorzystać z polecenia:

SET IDENTITY_INSERT [dbo].[test27072017] OFF;

Aby określić wartość generatora dla pola IDENTITY w konkretnej tabeli możemy skorzystać z następującego polecenia:
DBCC CHECKIDENT('dbo.tabela', RESEED, 400);
W powyższym przykładzie dla tabeli o nazwie 'tabela' znajdującej się w schemacie 'dbo' zostanie ustawiona wartość generatora 400 dla pola typu identity.

Aby sprawdzić aktualną wartość pola typy identity w konkretnej tabeli należy użyć polecenia: 
SELECT IDENT_CURRENT('dbo.tabela') AS [IDENT_CURRENT];

poniedziałek, 5 marca 2018

[PL] SQL Server 2012 SP4 - reguły (ograniczenia) zawartości kolumn

W momencie gdy pojawia się potrzeba kontrolowania wartości jakie mogą pojawić się w konkretnej kolumnie w bazie danych istnieje możliwość utworzenia tzw. ograniczenia (constraint). Przykładowo, możemy mieć tabelę przeznaczoną na dane osób (np. klientów) i chcieć, aby w kolumnie „płeć” dało się wprowadzić jedynie wartości zgodne ze standardem PN-ISO 5218, gdzie: 0 oznacza płeć nieokreśloną, 1 – mężczyznę, 2 – kobietę, 9 – wartość nieznaną. Aby to zrobić, podczas tworzenia tabeli możemy zastosować polecenie CONSTRAINT zgodnie z przykładem poniżej.

USE BazaTestowa
GO

CREATE TABLE dbo.Osoby (
Id BIGINT IDENTITY(1,1)
               NOT NULL
               PRIMARY KEY,
Imie nvarchar(200) NOT NULL,
Nazwisko nvarchar(200) NOT NULL,
DataUrodzenia date NOT NULL,
Plec char(1) NOT NULL
CONSTRAINT CHK_Osoby_Plec_wartosc_zgodna_z_PN_ISO_5218
CHECK (Plec in ('0', '1', '2', '9')),
);

Jeżeli zechcemy teraz wprowadzić do bazy danych wiersz zawierający zawartość kolumny Plec w postaci cyfry 0, 1, 2 lub 9 to operacja powinna się udać.

INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec)
VALUES (N'Jan',N'Kowalski', '1990-01-01', '1');

Jednak w przypadku próby wprowadzenia do bazy danych np. wartości 3 w kolumnie Plec (czy innej niż 0,1,2 lub 9), wspomniana czynność nie uda się – zostanie wyświetlony błąd odwołujący się do stworzonego wcześniej ograniczenia. 

INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec)
VALUES (N'Anna',N'Kowalska', '1980-01-01', '3');