Založení tabulky v databázi patří mezi základní úlohy. Při založení pomocí příkazu sql CREATE TABLE tabulky definujeme:
- Název tabulky spolu s určením schématu a ideálně databáze
- Seznam sloupců spolu s datovými typy, constraints a definováním toho jestli může být sloupec prázdný (NULL vs NOT NULL)
Tabulku můžeme založit v SQL dvěma základními způsoby:
- CREATE TABLE – v tomto případě explicitně definujeme všechny komponenty tabulky – datové typy, primární/cizí klíče, constraints, atd.
- SELECT INTO – není potřeba definovat komponenty tabulky. Ta je založena automaticky na základě seznamu sloupců v SELECT části skriptu. Při této variantě založení tabulky se nezaloží do nové tabulky constraints, které jsou definovány nad podkladovou tabulkou
Syntaxe CREATE TABLE
Syntaxe vytvoření tabulky je vcelku snadná. 1
- Na začátku máme CREATE TABLE
- Definujeme název tabulky ideálně ve formátu [databaze].[schema].[tabulka]
- Následně v závorce nadefinujeme všechny sloupce, jejich datové typy, jestli můžou být prázdné nebo ne
- Můžeme např. rovnou definovat např autoinkrement soupec typu IDENTITY(1,1), calculated column (sloupec obsahující nějaký vzorec) a podobně. Vlastnosti sloupce typu IDENTITY se speciálně věnuju v článku SQL IDENTITY (Auto increment) – Automatické zvýšení hodnoty, popis argumentů příkazu
CREATE TABLE Databaze.Schema.Nova_Tabulka (
<Sloupec 1> Datovy_typ NULL,
<Sloupec 2> Datovy_typ NOT NULL,
...);
Příklad založení tabulky pomocí CREATE TABLE
Pochopení syntaxe sql CREATE TABLE je nejsnažší na příkladu. Založme si na zkoušku tabulku se zaměstnanci, která bude obsahovat údaje k pracovníkům, kde:
- ID_Zamestnanec – bude primární klič tabulky – jedinečný identifikátor číselného typu
- Jmeno, Prijmeni, Pozice, Oddeleni – bude typu VARCHAR, hodnota musí být vždy vyplněna (NOT NULL)
- FK_NadrizenyZamestnanec – cizí klíč na šéfa daného zaměstnance – uděláme formou self seferenced foreign key – pole s nadřízeným bude reference na primární klíč ID_Zamestnanec. Pole může být NULL, nejvýše postavení zaměstnanci nemají nadřízeného
- Zamestnan_Od, Zamestnan_Do – datumové pole. Zamestnan_Do může být NULL
- Je_Zamestnan – Identifikátor jestli je zaměstanec v současné době zaměstnán, nabává hodnoty 1,0. Nemůže být prázdné
Tabulku s výše nadeninovaným seznamem sloupců, datovými typy a definicemi založíme takto:
CREATE TABLE dbo.Zamestnanci (
ID_Zamestnanec INTEGER IDENTITY(1,1) PRIMARY KEY,
Jmeno VARCHAR(255) NOT NULL,
Prijmeni VARCHAR(255) NOT NULL,
Pozice VARCHAR (255) NOT NULL,
FK_NadrizenyZamestnanec INT NULL,
Oddeleni VARCHAR (255) NOT NULL,
Plat INTEGER NOT NULL,
Zamestnan_Od DATE NOT NULL,
Zamestnan_Do DATE NULL,
Je_Zamestnan INT NOT NULL
);
ALTER TABLE dbo.Zamestnanci
ADD CONSTRAINT FK_SelfReference FOREIGN KEY (FK_NadrizenyZamestnanec) REFERENCES dbo.Zamestnanci (ID_Zamestnanec);
Vidíme, že skript má 2 části, pomocí příkazu jsme vytvořili tabulku a pomocí DDL příkazu ALTER TABLE přidáváme constraint typu cizí klíč.
Syntaxe založení tabulky přes SELECT INTO
Tento způsob se používá pro scénáře kdy nepotřebujeme speciálně definovat vlastnosti sloupcí, constraints a podobně. 2 Prostřednictvím select into se nám vytvoří tabulka, která si datové typy přebere ze SELECTu, ale nic dalšího ze zdrojové tabulky obsahovat nebude (indexy, sql trigery apod). Je to tedy dobrý způsob jak založit nějaké dočasné pomocné tabulky, které po sobě následně uklidíme. Tempové tabulky se typicky řeší jiným způsobem – SQL Tempová tabulka – Rozdíl mezi # a ## temp tabulkou, takže těch scénářů ve kterých bych doporučil SELECT INTO není moc.
SELECT <Sloupec1>, <Sloupec2>
INTO Databaze.Schema.Nova_Tabulka
FROM Databaze.Schema.Tabulka;
Použité zdroje
- Microsoft dokumentace, CREATE TABLE (Transact-SQL) [on-line]. [cit. 2017-04-30]. Dostupné z WWW: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver16
- Microsoft dokumentace, SELECT – INTO Clause (Transact-SQL) [on-line]. [cit. 2017-04-30]. Dostupné z WWW: https://learn.microsoft.com/en-us/sql/t-sql/queries/select-into-clause-transact-sql?view=sql-server-ver16
SUPER, TO JSEM PRESNE POTREBOVAL
DIKY