Много разработчици и администратори на бази данни създават бази данни с помощта на GUI инструменти като SQL Server Management Studio (SSMS), Azure Data Studio и др.
Но може да бъде много по-бързо да създавате бази данни с SQL. Това е особено вярно, ако имате различни среди, в които трябва да пресъздадете една и съща база данни. Можете да стартирате един и същ скрипт срещу всяка среда и базата данни ще бъде създадена в рамките на секунди всеки път.
В SQL Server правим това с T-SQL. T-SQL означава Transact-SQL и е разширение на SQL Server към SQL.
По-долу е даден пример за използване на T-SQL за създаване на база данни в SQL Server.
Основ код
CREATE DATABASE Music;
Това е целият код, който ви е необходим, за да създадете база данни. В този случай той създава база данни, наречена Музика .
Това обаче е всичко, което създава. Базата данни не съдържа никакви таблици или други обекти. За да направите това, трябва да използвате допълнителни оператори, за да създадете тези обекти, както е необходимо.
Също така, горният CREATE DATABASE
изразът използва най-основния синтаксис, който не включва никакви аргументи. Има много опции, които могат да бъдат включени в това изявление.
Например можете да посочите собствено име за файловете и техните файлови групи. Можете също да създадете моментна снимка на база данни или да прикачите файлове на база данни, за да създадете база данни от отделените файлове на друга база данни.
Вижте документацията на Microsoft за пълния синтаксис на това изявление.
Създаване на таблици
Ето пример за създаване на три таблици за горната база данни.
USE Music;
CREATE TABLE Artists (
ArtistId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ArtistName nvarchar(255) NOT NULL,
ActiveFrom date
);
CREATE TABLE Genres (
GenreId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
Genre nvarchar(50) NOT NULL
);
CREATE TABLE Albums (
AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
AlbumName nvarchar(255) NOT NULL,
ReleaseDate date NOT NULL,
ArtistId int NOT NULL,
GenreId int NOT NULL
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)
REFERENCES dbo.Artists (ArtistId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Първата стъпка е да преминете към правилната база данни (в този случай базата данни за музика). За да направим това, използваме USE MUSIC
.
След като използвате правилната база данни, можете да създадете своите таблици и други обекти. В този случай създадох три таблици. Всеки път, когато използвам CREATE TABLE
, последвано от името на таблицата, която искам да създам. Това е последвано от дефиницията на тази таблица.
Определението включва колоните на таблицата и техните дефиниции. Например ArtistId
е колона, използва int тип данни и съм го задал като първичен ключ за таблицата. Това, че е първичен ключ, означава, че той уникално идентифицира всеки ред в базата данни.
Също така зададох тази колона като IDENTITY
колона, което означава, че всеки ред ще използва автоматично генерирана стойност, която се увеличава с всеки ред. В този случай тя ще започне от 1 и ще се увеличава с 1 (това е защото съм посочил IDENTITY(1,1)
.
И накрая, аз също зададох тази колона на NOT NULL
. Това означава, че трябва да съдържа стойност. Не може да бъде нула. Това всъщност е изискване, преди да зададете колоната като първичен ключ, но можете също да зададете други колони на NOT NULL
според изискванията (което направих в този пример).
Създаване на връзки
В горния пример създадох връзка между Albums
и Artists
маси.
Връзката е вид връзка между таблици със свързани данни. Връзките помагат за налагането на целостта на данните, тъй като ви позволяват да посочите, че колона може да съдържа само стойности, които съвпадат със стойностите в конкретна колона в друга таблица.
Ето конкретната част от кода от горния пример, която създава връзката:
CREATE TABLE Albums (
AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
AlbumName nvarchar(255) NOT NULL,
ReleaseDate date NOT NULL,
ArtistId int NOT NULL,
GenreId int NOT NULL
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)
REFERENCES dbo.Artists (ArtistId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Създадох връзката в същото време, когато създадох Albums
маса. Успях да го направя, защото вече бях създал Artists
таблица (която е другата таблица в връзката).
Създадох връзката, като създадох ограничение за външен ключ (използвайки CONSTRAINT
аргумент) и посочване на FOREIGN KEY
заедно с подробностите за връзката. REFERENCES
ключова дума определя коя таблица и колона са препратките към външния ключ.
Нарекох връзката FK_Albums_Artists
.
ON DELETE
и ON UPDATE
частите са по избор. Те определят какво да се направи в случай, че някой изтрие или актуализира ред от колоната родител/първичен ключ. Стойността по подразбиране е NO ACTION
, което означава, че Database Engine повдига грешка и действието за актуализиране на реда в родителската таблица се връща назад.
Статията ми за Как да създадете връзка в SQL изброява другите опции, които можете да предоставите тук, както и какво прави всяка опция.
Създаване на връзки по-късно
Можете също да създадете връзка върху съществуваща таблица.
За да направите това с T-SQL, използвайте ALTER TABLE
изявление.
Така че мога да стартирам следния код, след като изпълня предишния код.
ALTER TABLE Albums
ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId)
REFERENCES dbo.Genres (GenreId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
;
Това създава друга връзка, този път между Albums
и Genres
маси.
Можете да видите, че този код прави почти същото нещо като предишната връзка. Единствената разлика е, че връзката е между Artists
и Genres
вместо Albums
и Artists
.
В този случай нарекох връзката FK_Albums_Genres
.
Вмъкване на данни
Горният код създаде база данни, която е подходяща за данни. Вече можем да добавяме данни.
В SQL Server можете да добавяте данни към база данни, като използвате INSERT
изявление. Когато използвате този израз, трябва да предоставите името на таблицата, както и колоните, в които искате да вмъкнете данни.
Всъщност предоставянето на колоните е по избор, ако вмъквате данни във всички колони, но за по-голяма яснота ето пример, който включва имената на колоните.
INSERT INTO Artists (ArtistName, ActiveFrom)
VALUES
('Iron Maiden','1975-12-25'),
('AC/DC','1973-01-11'),
('Allan Holdsworth','1969-01-01'),
('Buddy Rich','1919-01-01'),
('Devin Townsend','1993-01-01'),
('Jim Reeves','1948-01-01'),
('Tom Jones','1963-01-01'),
('Maroon 5','1994-01-01'),
('The Script','2001-01-01'),
('Lit','1988-06-26'),
('Black Sabbath','1968-01-01'),
('Michael Learns to Rock','1988-03-15'),
('Carabao','1981-01-01'),
('Karnivool','1997-01-01'),
('Birds of Tokyo','2004-01-01'),
('Bodyjar','1990-01-01');
INSERT INTO Genres (Genre)
VALUES
('Rock'),
('Jazz'),
('Country'),
('Pop'),
('Blues'),
('Hip Hop'),
('Rap'),
('Punk');
INSERT INTO Albums (AlbumName, ReleaseDate, ArtistId, GenreId)
VALUES
('Powerslave', '1984-09-03', 1, 1),
('Powerage', '1978-05-05', 2, 1),
('Singing Down the Lane', '1956-01-01', 6, 3),
('Ziltoid the Omniscient', '2007-05-21', 5, 1),
('Casualties of Cool', '2014-05-14', 5, 1),
('Epicloud', '2012-09-18', 5, 1),
('Somewhere in Time', '1986-09-29', 1, 1),
('Piece of Mind', '1983-05-16', 1, 1),
('Killers', '1981-02-02', 1, 1),
('No Prayer for the Dying', '1990-10-01', 1, 1),
('No Sound Without Silence', '2014-09-12', 9, 4),
('Big Swing Face', '1967-06-01', 4, 2),
('Blue Night', '2000-11-01', 12, 4),
('Eternity', '2008-10-27', 12, 4),
('Scandinavia', '2012-06-11', 12, 4),
('Long Lost Suitcase', '2015-10-09', 7, 4),
('Praise and Blame', '2010-06-26', 7, 4),
('Along Came Jones', '1965-05-21', 7, 4),
('All Night Wrong', '2002-05-05', 3, 2),
('The Sixteen Men of Tain', '2000-03-20', 3, 2);
Както можете да видите, всеки ред има своя собствена линия. Просто добавяме по един ред на ред, като всяка колона е разделена със запетая и заобиколена от скоби. Всеки ред също разделя със запетая (след скобите).
Изпълнението на горния код срещу нашата новосъздадена база данни води до следния изход:
(16 rows affected) (8 rows affected) (20 rows affected)
Това ни казва, че данните са били вмъкнати успешно.
Проверете базата данни
Можем да проведем бърз тест срещу базата данни, за да проверим дали тя е създадена и нашите данни са вмъкнати.
Например, можем да изпълним следната проста заявка.
SELECT * FROM Artists;
Резултат:
+------------+------------------------+--------------+ | ArtistId | ArtistName | ActiveFrom | |------------+------------------------+--------------| | 1 | Iron Maiden | 1975-12-25 | | 2 | AC/DC | 1973-01-11 | | 3 | Allan Holdsworth | 1969-01-01 | | 4 | Buddy Rich | 1919-01-01 | | 5 | Devin Townsend | 1993-01-01 | | 6 | Jim Reeves | 1948-01-01 | | 7 | Tom Jones | 1963-01-01 | | 8 | Maroon 5 | 1994-01-01 | | 9 | The Script | 2001-01-01 | | 10 | Lit | 1988-06-26 | | 11 | Black Sabbath | 1968-01-01 | | 12 | Michael Learns to Rock | 1988-03-15 | | 13 | Carabao | 1981-01-01 | | 14 | Karnivool | 1997-01-01 | | 15 | Birds of Tokyo | 2004-01-01 | | 16 | Bodyjar | 1990-01-01 | +------------+------------------------+--------------+
И нека изпълним друга заявка, която използва данни от трите таблици.
SELECT
ArtistName,
AlbumName,
ReleaseDate
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId
WHERE g.Genre = 'Rock';
Резултат:
+----------------+-------------------------+---------------+ | ArtistName | AlbumName | ReleaseDate | |----------------+-------------------------+---------------| | Iron Maiden | Powerslave | 1984-09-03 | | AC/DC | Powerage | 1978-05-05 | | Devin Townsend | Ziltoid the Omniscient | 2007-05-21 | | Devin Townsend | Casualties of Cool | 2014-05-14 | | Devin Townsend | Epicloud | 2012-09-18 | | Iron Maiden | Somewhere in Time | 1986-09-29 | | Iron Maiden | Piece of Mind | 1983-05-16 | | Iron Maiden | Killers | 1981-02-02 | | Iron Maiden | No Prayer for the Dying | 1990-10-01 | +----------------+-------------------------+---------------+
Тази заявка демонстрира важността на създаването на връзки между таблици със свързани данни. Когато изпълняваме заявки като тази, наистина се нуждаем данните да са съгласувани между таблиците.
Базата данни вече е готова за използване. Можем да изпълняваме заявки срещу него. Можем да вмъкнем още данни. Можем да добавим още таблици, връзки, изгледи, съхранени процедури, дефинирани от потребителя функции и много други.