Vytvoření tabulky v sql. Smazání databáze. CREATE TABLE Statement a deklarativní omezení integrity

Nejnovější aktualizace: 09.07.2017

Chcete-li vytvořit tabulky, použijte příkaz CREATE TABLE. Pomocí tohoto příkazu můžete použít řadu operátorů, které definují sloupce tabulky a jejich atributy. A navíc můžete využít řadu operátorů, které určují vlastnosti tabulky jako celku. Jedna databáze může obsahovat až 2 miliardy tabulek.

Obecná syntaxe pro vytvoření tabulky je následující:

CREATE TABLE název_tabulky (název_sloupce1 datový_typ_atributy_sloupce1, název_sloupce2 datový_typ_atributy_sloupce2, ................................... . ......... název_sloupceN typ_dat typ_atributy_sloupceN, atributy_tabulky)

Po příkazu CREATE TABLE následuje název vytvořená tabulka. Název tabulky funguje jako její identifikátor v databázi, proto musí být jedinečný. Název nesmí být delší než 128 znaků. Název se může skládat z alfanumerických znaků a také ze znaků $ a podtržítka. Kromě toho musí být prvním znakem písmeno nebo podtržítko.

Název objektu nemůže obsahovat mezery a nemůže představovat jedno z klíčových slov Transact-SQL. Pokud identifikátor stále obsahuje prázdné znaky, pak by měl být uzavřen v uvozovkách. Pokud je nutné jako název použít klíčová slova, pak se tato slova umístí do hranatých závorek.

Příklady správných identifikátorů:

Uživatelské značky $345 users_accounts "uživatelské účty"

Za názvem tabulky jsou v závorce uvedeny parametry všech sloupců a úplně na konci atributy, které se vztahují na celou tabulku. Atributy sloupců a atributy tabulek jsou volitelné součásti a lze je vynechat.

Ve své nejjednodušší podobě musí příkaz CREATE TABLE obsahovat minimálně název tabulky a názvy a typy sloupců.

Tabulka může obsahovat 1 až 1024 sloupců. Každý sloupec musí mít v aktuální tabulce jedinečný název a musí mu být přiřazen datový typ.

Například definování nejjednodušší tabulky Zákazníci:

CREATE TABLE Zákazníci (ID INT, Věk INT, Jméno NVARCHAR(20), Příjmení NVARCHAR(20), E-mail VARCHAR(30), Telefon VARCHAR(20))

V v tomto případě Tabulka Zákazníci definuje šest sloupců: ID, Jméno, Příjmení, Věk, E-mail, Telefon. První dva sloupce představují ID klienta a věk a jsou typu INT, což znamená, že budou ukládat číselné hodnoty. Následující dva sloupce představují jméno a příjmení klienta a jsou typu NVARCHAR(20) , což znamená, že představují řetězec UNICODE o délce nejvýše 20 znaků. Poslední dva sloupce E-mail a Telefon představují adresu e-mail a telefonní číslo klienta a jsou typu VARCHAR(30/20) - také ukládají řetězec, ale ne v kódování UNICODE.

Vytvoření tabulky v SQL Management Studio

Pojďme tvořit jednoduchý stůl na serveru. Chcete-li to provést, otevřete SQL Správa serveru Studio a klikněte klikněte pravým tlačítkem myší na název serveru. V zobrazené kontextové nabídce vyberte Nový dotaz.

Tabulka je vytvořena v aktuální databázi. Pokud spustíme okno editoru SQL, jak je uvedeno výše - pod jménem serveru, pak se výchozí databáze nenainstaluje. A k její instalaci je potřeba použít příkaz USE, za kterým následuje název databáze. Proto do pole editoru příkazů SQL zadáváme následující výrazy:

USE usersdb; CREATE TABLE Zákazníci (ID INT, Věk INT, Jméno NVARCHAR(20), Příjmení NVARCHAR(20), E-mail VARCHAR(30), Telefon VARCHAR(20));

To znamená, že do databáze bude přidána tabulka Zákazníci, o které jsme hovořili dříve.

Editor můžete otevřít také z databáze tak, že na něj kliknete pravým tlačítkem a vyberete Nový dotaz:

V tomto případě bude databáze, ze které byl editor otevřen, považována za aktuální a nebude nutné ji dodatečně instalovat pomocí příkazu USE.

Odstranění stolů

Chcete-li zrušit tabulky, použijte příkaz DROP TABLE, který má následující syntaxi:

DROP TABLE tabulka1 [, tabulka2, ...]

Například odstranění tabulky Zákazníci:

DROP TABLE Zákazníci

Přejmenování tabulky

Chcete-li přejmenovat tabulky, použijte systémovou uloženou proceduru "sp_rename". Například přejmenování tabulky Users na UserAccounts v databázi usersdb:

USE usersdb; EXEC sp_rename "Users", "UserAccounts";

Než budete moci vytvořit tabulku SQL, musíte definovat model databáze. Navrhněte ER diagram, ve kterém definujete entity, atributy a vztahy.

Základní pojmy

Entity jsou objekty nebo skutečnosti, o kterých musí být uloženy informace. Například zaměstnanec firmy nebo projekty realizované firmou. Atributy jsou komponenty, které popisují nebo kvalifikují entitu. Například atribut entity „zaměstnanec“ je mzdy a atributem entity „projekt“ jsou odhadované náklady. Spojení jsou asociace mezi dvěma prvky. Může být obousměrný. Existuje také rekurzivní spojení, tedy spojení entity se sebou samým.

Je také nutné určit klíče a podmínky, za kterých bude zachována integrita databáze. co to znamená? Jinými slovy omezení, která pomohou udržet databáze ve správné a konzistentní podobě.

Přechod z ER diagramu na tabulkový model

Pravidla pro přechod na tabulkový model:

  1. Převeďte všechny entity na tabulky.
  2. Převeďte všechny atributy na sloupce, to znamená, že každý atribut entity se musí objevit v názvu sloupce tabulky.
  3. Převeďte jedinečné identifikátory na primární klíče.
  4. Převeďte všechny vztahy na cizí klíče.
  5. Vytvořte tabulku SQL.

Vytvoření databáze

Nejprve musíte běžet MySQL server. Chcete-li jej spustit, přejděte do nabídky „Start“, poté do „Programy“ a poté do MySQL a My SQL Server, vyberte MySQL-Command-Line-Client.

Pro vytvoření databáze použijte příkaz Create Database. Tato funkce má následující formát:

VYTVOŘIT DATABÁZI název_databáze.

Omezení týkající se názvu databáze jsou následující:

  • délka je až 64 znaků a může obsahovat písmena, čísla, symboly "" a "";
  • jméno může začínat číslicí, ale musí obsahovat písmena.

Musíme si pamatovat a obecné pravidlo: Jakýkoli dotaz nebo příkaz končí oddělovačem. V SQL je běžné používat jako oddělovač středník.

Server musí uvést, se kterou databází bude potřebovat pracovat. K tomu existuje příkaz USE. Tento operátor má jednoduchou syntaxi: USE n název_databáze.

Vytvoření tabulky SQL

Takže je navržen model, vytvořena databáze a serveru je přesně řečeno, jak s ní pracovat. Nyní můžete začít vytvářet SQL tabulky. Existuje jazyk DDL (Data Definition Language). Slouží k vytváření MS SQL tabulky, stejně jako k definování objektů a práci s jejich strukturou. DDL obsahuje sadu příkazů.

Vytvoření tabulky serveru SQL

Pomocí jediného příkazu DDL můžete vytvářet různé databázové objekty změnou jeho parametrů. Používá se příkaz Vytvořit tabulku. Formát tt vypadá takto:

VYTVOŘIT TADLE název_tabulky,(název_sloupce1 Jméno _sloupec2 datový typ [column_constraint], [table_constraints]).

Syntaxe tohoto příkazu by měla být popsána podrobněji:

  • Název tabulky musí být dlouhý až 30 znaků a začínat písmenem. Jsou povoleny pouze abecední znaky, písmena a symboly "_", "$" a "#". Použití azbuky je povoleno. Je důležité si uvědomit, že názvy tabulek by neměly být stejné jako názvy jiných objektů nebo vyhrazená slova databázového serveru, jako je sloupec, tabulka, index atd.
  • Pro každý sloupec musíte zadat datový typ. Existuje standardní sada, který používá většina. Například Char, Varchar, Číslo, Datum, zadejte Null atd.

  • Parametr Výchozí umožňuje nastavit výchozí hodnotu. Tím zajistíte, že v tabulce nebudou žádné hodnoty null. Jak tomu rozumět? Výchozí hodnotou může být symbol, výraz, funkce. Je důležité si pamatovat, že tento výchozí datový typ musí odpovídat vstupnímu datovému typu sloupce.
  • Omezení na každém sloupci se používají k vynucení podmínek integrity pro data na úrovni tabulky. Existují další nuance. Je zakázáno smazat tabulku, pokud jsou na ní závislé jiné tabulky.

Jak pracovat s databází

Pro realizaci velké projekty Nejčastěji potřebujete vytvořit více databází, z nichž každá vyžaduje mnoho tabulek. Samozřejmě je nemožné, aby si uživatelé uchovali všechny informace v hlavě. K tomu je možné zobrazit strukturu databází a tabulek v nich. Existuje několik příkazů, konkrétně:

  • ZOBRAZIT DATABÁZE - zobrazí na obrazovce všechny vytvořené SQL databáze;
  • SHOW TABLES - zobrazí seznam všech tabulek pro aktuální databázi, které jsou vybrány příkazem USE;
  • POPSAT název_tabulky- zobrazí popis všech sloupců tabulky.
  • ALTER TABLE - umožňuje změnit strukturu tabulky.

Poslední příkaz umožňuje:

  • přidat sloupec nebo omezení do tabulky;
  • změnit existující sloupec;
  • odstranit sloupec nebo sloupce;
  • odstranit integritní omezení.

Syntaxe tohoto příkazu je: ALTER TABLE název_tabulky( | | | | [(ZAPNOUT | ZAKÁZAT) KONSTANTNÍ omezení_název ] | }.

Existují další příkazy:

  • PŘEJMENOVAT - přejmenuje tabulku.
  • ZKRÁTIT TABULKU - odstraní všechny řádky z tabulky. Tato funkce může být potřebná, když potřebujete znovu vyplnit tabulku, ale není třeba ukládat předchozí data.

Existují také situace, kdy se struktura databáze změnila a tabulka by měla být smazána. K tomu existuje příkaz DROP. Samozřejmě je nejprve potřeba vybrat databázi, ze které chcete tabulku smazat, pokud se liší od aktuální.

Syntaxe příkazu je poměrně jednoduchá: DROP TABLE Jméno_tabulky.

V SQL Vytvoření přístupu tabulky a jejich modifikace se provádí stejnými příkazy uvedenými výše.

Pomocí CREATE TABLE můžete vytvořit prázdnou tabulku a poté ji vyplnit daty. Ale to není všechno. Můžete také přímo vytvořit tabulku z jiné tabulky. jak to je? To znamená, že je možné definovat tabulku a naplnit ji daty z jiné tabulky. K tomu existuje speciální klíčové slovo AS.

Syntaxe je velmi jednoduchá:

  • VYTVOŘIT TABULKU Jméno_tabulky[(definice_sloupce)] AS dílčí dotaz;
  • definice_sloupce - názvy sloupců, pravidla integrity pro nově vytvořené sloupce tabulky a výchozí hodnoty;
  • subquery - vrací řádky, které je třeba přidat do nové tabulky.

Takový příkaz tedy vytvoří tabulku s určitými sloupci, vloží do ní řádky, které se vrátí v dotazu.

Dočasné tabulky

Dočasné tabulky jsou tabulky, jejichž data jsou vymazána na konci každé relace nebo dříve. Používají se k nahrávání střední hodnoty nebo výsledky. Lze je použít jako pracovní listy. Dočasné můžete definovat v jakékoli relaci, ale jejich data lze použít pouze v aktuální relaci. Vytvoření dočasného SQL tabulky probíhá stejným způsobem jako obvykle pomocí příkazu CREATE TABLE. Chcete-li systému ukázat, že tabulka je dočasná, musíte použít parametr GLOBAL TEMPORARY.

Klauzule ON COMMIT nastavuje životnost dat v takové tabulce a může provádět následující:

  • ODSTRANIT ŘÁDKY - po každém dokončení transakce vymaže dočasnou tabulku (smaže všechna data relace). Toto je obvykle výchozí hodnota.
  • ZACHOVAT ŘÁDKY - ponechat data pro použití v další transakci. Kromě toho můžete stůl vyčistit až po skončení relace. Ale jsou tu některé zvláštnosti. Pokud je transakce vrácena zpět (ROLLBACK), tabulka se vrátí do stavu na konci předchozí transakce.

Syntaxe pro vytvoření dočasné tabulky může být reprezentována následovně: CREATE TABLE Jméno_tabulky,(Jménosloupec_1 datový typ [column_constraint], Jméno _sloupec2 datový typ [column_constraint], [table_constraints]).

87

Parametr název_tabulky je název základní tabulky, která má být vytvořena. Maximální množství Počet tabulek, které může obsahovat jedna databáze, je omezen počtem databázových objektů, který nesmí překročit 2 miliardy, včetně tabulek, pohledů, uložených procedur, spouštěčů a omezení. Parametry col_name1, col_name2, ... označují názvy sloupců tabulky a parametry type1, type2, ... označují datové typy odpovídajících sloupců.

Název databázového objektu se může obvykle skládat ze čtyř částí ve tvaru:

]]jméno_objektu

Název_objektu je název databázového objektu, název_schématu je název schématu, ke kterému objekt patří, a název_serveru a název_db jsou názvy serveru a databáze, do které objekt patří. Názvy tabulek seskupené podle názvu schématu musí být v databázi jednoznačné. Stejně tak názvy sloupců musí být v tabulce jednoznačné.

Podívejme se nyní na omezení související s přítomností nebo nepřítomností hodnot NULL ve sloupci. Pokud sloupec není určen pro povolení hodnot NULL ( NENÍ NULL), To tento sloupec nemůže obsahovat hodnoty NULL a pokud se pokusíte takovou hodnotu vložit, systém vrátí chybovou zprávu.

Jak již bylo zmíněno, v databázovém schématu je vždy vytvořen databázový objekt (v tomto případě tabulka). Uživatel může vytvářet tabulky pouze ve schématu, pro které má oprávnění ALTER. Každý uživatel s rolí sysadmin, db_ddladmin nebo db_owner může vytvářet tabulky v libovolném schématu.

Tvůrce tabulky nemusí být jejím vlastníkem. To znamená, že jeden uživatel může vytvářet tabulky, které jsou ve vlastnictví jiných uživatelů. Podobně tabulka vytvořená pomocí příkazu CREATE TABLE nemusí patřit do aktuální databáze, pokud je před názvem tabulky uvedena jiná (existující) databáze a název schématu.

Schéma, do kterého tabulka patří, může mít dva možné výchozí názvy. Pokud je tabulka zadána bez explicitního názvu schématu, systém vyhledá název tabulky v příslušném výchozím schématu. Pokud název objektu nelze najít ve výchozím schématu, systém hledá ve schématu dbo. Názvy tabulek by měly být vždy uvedeny spolu s odpovídajícím názvem schématu. Vyhnete se tak možným nejistotám.

Níže uvedený příklad ukazuje, jak vytvořit všechny tabulky v databázi SampleDb. (Databáze SampleDb musí být nastavena jako aktuální databáze.)

POUŽÍVEJTE SampleDb; CREATE TABLE Department (číslo CHAR (4) NOT NULL, DepartmentName NCHAR (40) NOT NULL, Location NCHAR (40) NULL); VYTVOŘIT TABULKU. ( CHAR (4) NOT NULL, NCHAR (15) NOT NULL, FLOAT (53) NULL); CREATE TABLE dbo.Employee (Id INT NOT NULL, FirstName NCHAR (20) NOT NULL, LastName NCHAR (20) NOT NULL, DepartamentNumber CHAR (4) NULL); CREATE TABLE dbo.Works_on (EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, Job NCHAR (15) NULL, EnterDate DATE NULL);

Kromě datového typu a přítomnosti hodnoty NULL můžete ve specifikaci sloupce zadat následující parametry:

    klauzule DEFAULT;

    vlastnost IDENTITY.

klauzule DEFAULT ve specifikaci sloupce označuje výchozí hodnotu sloupce, tzn. při vložení nového řádku do tabulky bude buňka v tomto sloupci obsahovat specifikovaná hodnota, která v buňce zůstane, pokud do ní nezadáte jinou hodnotu. Jako výchozí hodnotu můžete použít konstantu, například jednu z funkce systému například USER, CURRENT_USER, SESSION_USER, SYSTEM_USER, CURRENT_TIMESTAMP a NULL.

Sloupec identifikátoru vytvořený zadáním vlastnosti IDENTITA, může mít pouze celočíselné hodnoty, které jsou obvykle systémem přiřazeny implicitně. Každá další hodnota vložená do takového sloupce je vypočítána inkrementací poslední hodnoty vložené do tohoto sloupce. Proto definice sloupce s vlastnost IDENTITY obsahuje (explicitně nebo implicitně) počáteční hodnotu a přírůstek (tento sloupec se také nazývá sloupec automatického přírůstku).

Níže je uveden příklad použití těchto pokynů:

POUŽÍVEJTE SampleDb; CREATE TABLE UserInfo (-- Pro sloupec Id bude použito automatické zvýšení IDENTITY(10,5), -- tj. při vkládání dat bude přiřazen první prvek -- hodnota 10, druhý 15, třetí 20 atd. Id INT NOT NULL PRIMÁRNÍ KLÍČ IDENTITA (10,5), Login VARCHAR(40) NOT NULL, -- Pole Datum narození bude nastaveno na výchozí datum -- (pokud toto pole není výslovně uvedeno při vkládání dat) Datum narození DATETIME DEFAULT (-- Výchozí - 30 let od aktuální datum DATEADD(rok; -30; GETDATE())))

CREATE TABLE Statement a deklarativní omezení integrity

Jednou z nejdůležitějších funkcí, které musí DBMS poskytovat, je způsob, jak zajistit integritu dat. Volají se omezení, která se používají k ověření dat při jejich úpravě nebo vložení omezení k zajištění integrity (omezení integrity). Zajištění integrity dat může provést uživatel v aplikačním programu nebo v systému správy databází. Většina důležité výhody Omezení integrity poskytovaná systémem správy databází jsou následující:

    zvyšuje se spolehlivost dat;

    zkracuje se čas programování;

    zjednodušuje údržbu.

Definování omezení integrity prostřednictvím DBMS zlepšuje spolehlivost dat tím, že eliminuje možnost, že by je aplikační programátor mohl zapomenout implementovat. Pokud jsou poskytnuta omezení integrity aplikační programy, pak všechny aplikace ovlivněné těmito omezeními musí obsahovat příslušný kód. Pokud kód chybí byť jen v jedné aplikaci, bude zpochybněna integrita dat.

Pokud systém správy databází neposkytuje omezení integrity, musí být definována v každém aplikačním programu, který používá data obsažená v omezení. Naproti tomu, pokud jsou omezení integrity poskytována systémem správy databází, stačí je definovat pouze jednou. Kromě toho je kód pro omezení poskytovaná aplikací obvykle složitější než pro stejná omezení poskytovaná DBMS.

Pokud jsou omezení integrity poskytována DBMS, pak pokud se omezení změní, je třeba odpovídající změny v kódu implementovat pouze jednou - v systému správy databází. A pokud jsou omezení poskytována aplikacemi, musí být v každé z těchto aplikací provedena úprava tak, aby odrážela změny v omezeních.

Systémy pro správu databází poskytují dva typy omezení integrity:

    deklarativní omezení k zajištění integrity;

    procedurální omezení k zajištění integrity implementovaná prostřednictvím spouštěčů.

Deklarativní omezení jsou definována pomocí příkazů DDL CREATE TABLE a ALTER TABLE. Tato omezení mohou být na úrovni sloupců nebo tabulky. Omezení na úrovni sloupce jsou definována spolu s datovým typem a dalšími vlastnostmi sloupce v deklaraci sloupce, zatímco omezení na úrovni tabulky jsou vždy definována na konci příkazu CREATE TABLE nebo ALTER TABLE poté, co byly definovány všechny sloupce.

Mezi omezeními na úrovni sloupců a omezeními na úrovni tabulky je pouze jeden rozdíl: omezení na úrovni sloupců se mohou vztahovat pouze na jeden sloupec, zatímco omezení na úrovni tabulky mohou zahrnovat více než jeden sloupec v tabulce.

Každé deklarativní omezení je pojmenováno. Tento název lze přiřadit explicitně pomocí volby OMEZENÍ v příkazu CREATE TABLE nebo ALTER TABLE. Pokud není zadána možnost CONSTRAINT, je název omezení přiřazen implicitně databázovým strojem. Důrazně se doporučuje používat explicitní názvy omezení, protože to může výrazně zlepšit vyhledávání těchto omezení.

Deklarativní omezení lze seskupit do následujících kategorií:

    klauzule DEFAULT;

    UNIKÁTNÍ klauzule;

    klauzule PRIMARY KEY;

    doložka CHECK;

    referenční integrita a klauzule FOREIGN KEY.

Použití klauzule DEFAULT k definování výchozího omezení bylo ukázáno dříve. Všechna ostatní omezení jsou popsána v následujících částech.

UNIKÁTNÍ nabídka

Někdy má několik sloupců nebo skupina sloupců tabulky jedinečné hodnoty, což umožňuje jejich použití jako primární klíč. Volají se sloupce nebo skupiny sloupců, které lze použít jako primární klíč potenciální klíče (klíč kandidáta). Každý kandidátský klíč je definován pomocí klauzule UNIKÁTNÍ v příkazu CREATE TABLE nebo ALTER TABLE. Syntaxe klauzule UNIQUE je následující:

Volba CONSTRAINT v klauzuli UNIQUE přiřadí kandidátskému klíči explicitní název. Volba SKUPOVANÝ nebo NEZAHRNUTÝ To je způsobeno skutečností, že Database Engine vytváří index pro každý potenciální klíč tabulky. Tento index lze shlukovat, když fyzický řádřádků je určeno indexovaným pořadím hodnot sloupců. Pokud není zadáno pořadí řádků, index není klastrovaný. Výchozí hodnota je NEZAHRNUTÝ. Parametr col_name1 určuje název sloupce, který vytváří kandidátský klíč. ( Potenciální klíč může mít až 16 sloupců.)

Použití klauzule UNIQUE je uvedeno v příkladu níže. (Než spustíte tento příklad, musíte zrušit tabulku Projects v databázi SampleDb pomocí příkazu DROP TABLE Projects.)

POUŽÍVEJTE SampleDb; CREATE TABLE Projects (číslo CHAR(4) DEFAULT "p1", Název projektu NCHAR (15) NOT NULL, Budget FLOAT (53) NULL, CONSTRAINT unique_number UNIQUE (Number));

Každá hodnota ve sloupci Číslo v tabulce Projekty je jedinečná, včetně Hodnota NULL. (Stejně jako každá jiná hodnota s omezením UNIQUE, pokud jsou pro odpovídající sloupec povoleny hodnoty NULL, může tento sloupec obsahovat nejvýše jeden řádek s hodnotou NULL.) Pokus o vložení hodnoty do sloupce Number, který je již v selže, protože .To. systém to nepřijme. Explicitní název omezení definovaného v příkladu je jedinečné_číslo.

Nabídka PRIMÁRNÍHO KLÍČE

Primární klíč tabulky je sloupec nebo skupina sloupců, jejichž hodnoty se v každém řádku liší. Každý primární klíč je definován pomocí klauzule PRIMÁRNÍ KLÍČ v příkazu CREATE TABLE nebo ALTER TABLE. Syntaxe klauzule PRIMARY KEY je následující:

Všechny parametry klauzule PRIMARY KEY mají stejný význam jako odpovídající parametry stejného jména v klauzuli UNIQUE. Ale na rozdíl od sloupce UNIQUE sloupec PRIMARY KEY nepovoluje hodnoty NULL a má výchozí hodnotu CLUSTERED.

Níže uvedený příklad ukazuje deklaraci primárního klíče pro tabulku Zaměstnanec v databázi SampleDb. Než spustíte tento příklad, musíte zrušit tabulku Employee v databázi SampleDb pomocí příkazu DROP TABLE Employee.

POUŽÍVEJTE SampleDb; CREATE TABLE Zaměstnanec (Id INT NOT NULL, FirstName NCHAR (20) NOT NULL, LastName NCHAR (20) NOT NULL, DepartamentNumber CHAR (4) NULL, CONSTRAINT primary_id PRIMARY KEY (Id));

Opětovným spuštěním tohoto kódu se vytvoří tabulka Zaměstnanci s definovaným primárním klíčem. Primární klíč tabulky je definován deklarativním omezením integrity s názvem primární_id. Toto omezení integrity je omezení na úrovni tabulky, protože je určeno poté, co jsou definovány všechny sloupce v tabulce Zaměstnanec.

Následující příklad je ekvivalentní předchozímu s tím rozdílem, že primární klíč tabulky Zaměstnanec je definován jako omezení na úrovni sloupců.

POUŽÍVEJTE SampleDb; DROP TABLE Zaměstnanec; CREATE TABLE Zaměstnanec (Id INT NOT NULL CONSTRAINT primary_id PRIMARY KEY, First Name NCHAR (20) NOT NULL, LastName NCHAR (20) NOT NULL, DepartamentNumber CHAR (4) NULL);

V příkladu klauzule PRIMARY KEY patří k deklaraci odpovídajícího sloupce spolu s deklarací jeho datového typu a vlastnosti, která obsahuje hodnoty NULL. Z tohoto důvodu se toto omezení nazývá omezení na úrovni sloupců.

ZKONTROLUJTE nabídku

Zkontrolujte omezení (CHECK CONSTRAINT) definuje podmínky pro data vkládaná do sloupce. Každý řádek, který je vložen do tabulky, nebo každá hodnota, která aktualizuje hodnotu sloupce, musí splňovat tyto podmínky. Zkušební limity jsou stanoveny prostřednictvím návrhu KONTROLA, definovaný v příkazu CREATE TABLE nebo ALTER TABLE. Syntaxe klauzule CHECK je následující:

výraz musí být booleovská hodnota (pravda nebo nepravda) a může odkazovat na libovolné sloupce v aktuální tabulce (nebo pouze na aktuální sloupec, pokud je definován jako omezení na úrovni sloupců), ale ne na jiné tabulky. Klauzule CHECK není vynucena při replikaci dat, pokud je přítomna volba NOT FOR REPLICATION. (Při replikaci je databáze nebo její část uložena na více místech. Replikace může zlepšit dostupnost dat.)

Níže uvedený příklad ukazuje použití klauzule CHECK:

POUŽÍVEJTE SampleDb; CREATE TABLE Customer (CustomerId INTEGER NOT NULL, CustomerRole VARCHAR(100) NULL, CHECK (CustomerRole IN ("admin", "moderator", "user")));

Tabulka Customer, kterou příklad vytvoří, obsahuje sloupec CustomerRole, který obsahuje odpovídající kontrolní omezení. Když vložíte novou hodnotu, která se liší od hodnot v sadě („admin“, „moderator“, „user“), nebo když se pokusíte změnit existující hodnotu na hodnotu, která se od těchto hodnot liší, systém správy databáze vrátí chybovou zprávu.

Nabídka ZAHRANIČNÍHO KLÍČE

Cizí klíč je sloupec (nebo skupina sloupců tabulky) obsahující hodnoty, které odpovídají hodnotám primárního klíče ve stejné nebo jiné tabulce. Cizí klíč je definován pomocí klauzule CIZÍ KLÍČ v kombinaci s nabídkou ODKAZY. Syntaxe klauzule FOREIGN KEY je následující:

[ ((název_sloupce1) ,...)] ODKAZY název_tabulky ((název_sloupce2),...) Konvence syntaxe

Klauzule FOREIGN KEY explicitně definuje všechny sloupce, které jsou zahrnuty v cizím klíči. Klauzule REFERENCES určuje název tabulky obsahující sloupce, které vytvářejí odpovídající primární klíč. Počet sloupců a jejich datový typ v klauzuli FOREIGN KEY musí odpovídat počtu odpovídajících sloupců a jejich datovému typu v klauzuli REFERENCES (a samozřejmě musí odpovídat počtu sloupců a datových typů v primárním klíči tabulka, na kterou odkazují).

POUŽÍVEJTE SampleDb; CREATE TABLE Works_on (EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, Job NCHAR (15) NULL, EnterDate DATE NULL, CONSTRAINT primární_práce PRIMÁRNÍ KLÍČ (EmpId, ProjectNumber), CONSTRAINT zahraniční_zaměstnanec (ZAHRANIČNÍ KLÍČ) REZERVACE , OMEZENÍ zahraniční_projekt FOREIGN KEY (ProjectNumber) REFERENCE Projects (Number));

Tabulka Works_on v tomto příkladu je specifikována se třemi deklarativními omezeními, aby byla zajištěna integrita: Primary_works, Foreign_employee a Foreign_project. Tato omezení jsou omezením na úrovni tabulky, kde první určuje primární klíč a druhé a třetí cizí klíč tabulky Works_on. Cizí klíče navíc definují tabulky Zaměstnanec a Projekty jako referenční tabulky a jejich sloupce Id a Číslo jako odpovídající primární klíč sloupce se stejným názvem v tabulce Works_on.

Klauzuli FOREIGN KEY lze vynechat, pokud je cizí klíč definován jako omezení na úrovni tabulky, protože sloupec, na který se omezení vztahuje, je implicitní „seznam“ sloupců cizího klíče a klíčové slovo REFERENCES postačuje k označení, o jaký typ omezení se jedná. Tabulka může obsahovat maximálně 63 omezení FOREIGN KEY.

Definování cizích klíčů v databázových tabulkách vyžaduje definici jiného klíče důležité omezení k zajištění integrity: referenční integrita.

Referenční integrita vynucuje pravidla pro vkládání a aktualizace u tabulek, které obsahují cizí klíč a odpovídající omezení primárního klíče. Výše uvedený příklad má dvě taková omezení: Foreign_employe a Foreign_project. Klauzule REFERENCES v příkladu definuje tabulky Zaměstnanec a Projekty jako referenční (nadřazené) tabulky.

Pokud je referenční integrita zadána pro dvě tabulky, úprava hodnot primárního klíče a odpovídajícího cizího klíče nebude vždy možná. Následující části pojednávají o tom, kdy je to možné a kdy ne.

Úprava hodnot cizího nebo primárního klíče může způsobit problémy čtyřmi způsoby. Všechny tyto případy budou demonstrovány pomocí databáze SampleDb. První dva případy zahrnují úpravy referenční tabulky a poslední dva zahrnují úpravy nadřazené tabulky.

Potenciální problémy s referenční integritou – případ 1

Vložit nový řádek do tabulky Works_on s číslem zaměstnance 11111. Odpovídající příkaz Transact-SQL vypadá takto:

POUŽÍVEJTE SampleDb; INSERT INTO Works_on VALUES (11111, "p1", "qwe", GETDATE())

Při vkládání nového řádku do podřízené tabulky se používá Works_on nové číslo zaměstnanec EmpId, pro které neexistuje žádný odpovídající zaměstnanec (a číslo) v nadřazené tabulce Zaměstnanci. Pokud je pro obě tabulky definována referenční integrita, jak bylo provedeno dříve, Database Engine neumožní vložení nového řádku s tímto číslem EmpId.

Možné problémy s referenční integritou – případ 2

Změna čísla zaměstnance 9502 ve všech řádcích tabulky Works_on na číslo 11111. Odpovídající příkaz Transact-SQL vypadá takto:

V tomto případě je stávající hodnota cizího klíče v odkazující tabulce Works_on nahrazena novou hodnotou, která nemá odpovídající hodnotu v nadřazené tabulce Zaměstnanec. Pokud je pro obě tabulky definována referenční integrita, pak systém správy databází neumožní úpravu řádku s tímto číslem EmpId v tabulce Works_on.

Potenciální problémy s referenční integritou – případ 3

Nahrazení hodnoty 9502 ID čísla zaměstnance hodnotou 22222 v tabulce Zaměstnanec. Odpovídající příkaz Transact-SQL by vypadal takto:

Tento případ se pokouší nahradit stávající hodnotu ID zaměstnance 9502 hodnotou 22222 pouze v nadřazené tabulce Zaměstnanec, aniž by se změnily odpovídající hodnoty ID v odkazující tabulce Works_on. Systém tuto operaci neumožňuje. Referenční integrita neumožňuje existenci v referenční tabulce (tabulka, pro kterou ZAHRANIČNÍ nabídka KEY definuje cizí klíč) hodnoty, pro které neexistuje žádná odpovídající hodnota v nadřazené tabulce (tabulka, pro kterou klauzule PRIMARY KEY definuje primární klíč). Jinak by takové řádky v referenční tabulce byly „sirotci“. Pokud by byla povolena výše popsaná úprava tabulky Zaměstnanec, pak by řádky v tabulce Works_on s hodnotou Id 9502 byly sirotky. Systém tedy takovou úpravu neumožňuje.

Potenciální problémy s referenční integritou – případ 4

Odstranění řádku v tabulce Zaměstnanec s hodnotou Id 9502.

Tento případ je podobný případu 3. Pokud by byla provedena tato operace, byl by z tabulky Zaměstnanec odstraněn řádek s hodnotou Id, pro kterou existují odpovídající hodnoty v referenční (podřízené) tabulce Works_on.

Možnosti ON DELETE a ON UPDATE

Databázový stroj může reagovat odlišně na pokus o odstranění nebo úpravu primárního klíče. Pokud se pokusíte aktualizovat hodnoty cizího klíče, všechny tyto aktualizace budou nekonzistentní s odpovídajícím primárním klíčem a databáze tyto aktualizace odmítne a zobrazí chybovou zprávu.

Pokud se ale pokusíte provést aktualizace hodnot primárního klíče, které způsobí nekonzistenci v odpovídajícím cizím klíči, může databázový systém reagovat poměrně pružně. Obecně existují čtyři možnosti, které určují, jak může databázový systém reagovat:

ŽÁDNÁ AKCE

Upraveny (aktualizovány nebo odstraněny) jsou pouze ty hodnoty v nadřazené tabulce, které nemají odpovídající hodnoty v cizím klíči podřízené (odkazující) tabulky.

KASKÁDA

Úprava (aktualizace nebo mazání) jakýchkoli hodnot v nadřazené tabulce je povolena. Když aktualizujete hodnotu primárního klíče v nadřazené tabulce nebo když odstraníte celý řádek obsahující daná hodnota, v podřízené (odkazující) tabulce se aktualizují (tj. smažou) všechny řádky s odpovídajícími hodnotami cizího klíče.

SET NULL

Úprava (aktualizace nebo mazání) jakýchkoli hodnot v nadřazené tabulce je povolena. Pokud aktualizace hodnoty v nadřazené tabulce způsobí nekonzistenci v podřízené tabulce, nastaví databázový systém cizí klíč všech odpovídajících řádků v podřízené tabulce na hodnotu NULL. Totéž se stane, pokud je odstraněn řádek v nadřazené tabulce, což způsobí nekonzistenci v podřízené tabulce. Všechny nekonzistence dat jsou tedy ignorovány.

NASTAVIT VÝCHOZÍ

Podobně jako u možnosti SET NULL, ale s jednou výjimkou: všem cizím klíčům odpovídajícím upravovanému primárnímu klíči je přiřazena výchozí hodnota. Je samozřejmé, že po úpravě by primární klíč nadřazené tabulky měl stále obsahovat výchozí hodnotu.

V Jazyk Transact-SQL První dvě z těchto možností jsou podporovány. Použití možností ON DELETE a ON UPDATE je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; CREATE TABLE Works_on (EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, Job NCHAR (15) NULL, EnterDate DATE NULL, CONSTRAINT primární_práce PRIMÁRNÍ KLÍČ (EmpId, ProjectNumber), CONSTRAINT zahraniční_zaměstnanec (ZAHRANIČNÍ KLÍČ) REZERVACE ON DELETE CASCADE, CONSTRAINT Foreign_project FOREIGN KEY (ProjectNumber) REFERENCE Projects (Number) ON UPDATE CASCADE);

Tento příklad vytvoří tabulku Works_on pomocí možností ON DELETE CASCADE a ON UPDATE CASCADE. Pokud je tabulka Works_on načtena hodnotami, každé smazání řádku v tabulce Employee způsobí kaskádové odstranění všech řádků v tabulce Works_on, které mají hodnoty cizího klíče, které odpovídají hodnotám primárního klíče odstraňovaných řádků. v tabulce Zaměstnanci. Podobně každá aktualizace hodnoty sloupce Number v tabulce Project způsobí stejnou aktualizaci všech odpovídajících hodnot sloupce ProjectNumber tabulky Works_on.

Typ jazyka používaného v konkrétním DBMS se nazývá dialektSQL. Například se nazývá dialekt Oracle DBMS P.L./ SQL; MSSQLServer a DB2 používají dialekt Obchodovat- SQL; v Interbase a Firebird – isql. Každý dialekt SQL je do určité míry kompatibilní se standardem SQL, ale může mít rozdíly a specifická jazyková rozšíření, takže abyste zjistili syntaxi konkrétního příkazu SQL, měli byste se nejprve podívat Pomoc konkrétní DBMS.

Pro operace s databázemi a tabulkami poskytuje standard sql následující operátory:

Následuje syntaxe SQL92 pro tyto příkazy. Vzhledem k tomu, že se jejich syntaxe v DBMS může lišit od standardu, doporučuje se při provádění laboratorních prací konzultovat systém nápovědy DBMS.

Názvy databázových objektů (tabulky, sloupce atd.) se mohou skládat z alfanumerických znaků a znaku podtržítka. Speciální znaky (@$# atd.) obvykle označují speciální typ tabulky (systémová, dočasná atd.). Nedoporučuje se používat ve jménech národní (ruské) znaky, mezery a vyhrazená slova, ale pokud se přesto používají, pak by se taková jména měla psát v uvozovkách „..“ nebo v hranaté závorky [..].

Dále se při popisu konstrukcí SQL příkazů bude používat následující zápis: nepovinné části konstrukce se zapisují do hranatých závorek; alternativní provedení jsou odděleny svislou lištou | ; složené závorky () zvýrazňují logické bloky struktury; elipsy znamená, že předchozí část struktury se může mnohokrát opakovat. „Rozšiřitelné“ struktury jsou napsány v lomených závorkách< >.

Vytvoření databáze

VYTVOŘIT DATABÁZI Název_databáze

Odstranění jedné nebo více databází

DROP DATABASE Název_databáze[,Název_databáze…]

Deklarace aktuální databáze

POUŽITÍ Database_name -- v SQL Server a MySQL

NASTAVIT DATABÁZI Jméno_ základny_ data – ve Firebirdu

Vytvoření tabulky

VYTVOŘIT TABULKU Název_tabulky (

<описание_столбца> [, <column_description> |

<omezení integrity_tabulky>…]

< column_description>

Název sloupce TYP

(ŽÁDNÁ AKCE|KASKÁDOVÁ|NASTAVIT VÝCHOZÍ|NASTAVIT NULL)]

TYP Sloupec může být buď standardní datový typ (viz Tabulka 1) nebo název domény (viz část 6.2).

Některé DBMS umožňují vytvářet vypočítané sloupce (vypočítané sloupců). Jedná se o virtuální sloupce, jejichž hodnota není uložena ve fyzické paměti, ale je vypočítána serverem DBMS vždy, když se k tomuto sloupci přistupuje pomocí vzorce zadaného při deklaraci tohoto sloupce. Vzorec může obsahovat hodnoty z jiných sloupců v daném řádku, konstanty, vestavěné funkce a globální proměnné.

Popis počítaného sloupce v SQL Server je:

<описание_столбца> Název sloupce AS výraz

Popis počítaného sloupce v Firebird má tvar:

<описание_столбца> Název sloupce VYPOČÍTANO<výraz>

MySQL 3.23 DBMS nepodporuje počítané sloupce.

< >

OMEZENÍ Integrity_constraint_name

(JEDINEČNÝ|PRIMÁRNÍ KLÍČ)( list_of_columns_forming_key)

|CIZÍ KLÍČ ( seznam_ sloupců_FK)

ODKAZY Název_tabulky(seznam_sloupců_PK)

(ŽÁDNÁ AKCE|KASKÁDOVÁ|NASTAVIT VÝCHOZÍ|NASTAVIT NULL)]

(ŽÁDNÁ AKCE|KASKÁDOVÁ|NASTAVIT VÝCHOZÍ|NASTAVIT NULL)]

| ZKONTROLUJTE ( test_condition)

Některé DBMS umožňují deklaraci dočasných tabulek (které existují pouze během relace). Na serveru SQL Server musí názvy dočasných tabulek začínat znakem # (místní dočasné tabulky viditelné pouze uživateli, který je vytvořil) nebo ## (globální tabulky viditelné všem uživatelům); MySQL používá klíčové slovo TEMPORARY k vytvoření dočasných tabulek, například:

VYTVOŘITDOČASNÝTABULKA... (další syntaxi viz CREATE TABLE).

Změna struktury tabulky

Používá se ke změně typu sloupce existujících tabulek, přidávání a odstraňování sloupců a omezení integrity.

ALTER TABULKA Název_tabulky

Změna typu sloupce (v SQLServer a Firebird)

ALTER SLOUPEK Název sloupce nový_TYPE

Změna typu sloupce, názvu a omezení (v MySQL)

ZMĚNIT SLOUPEK Název sloupce <column_description>

Přidejte běžný nebo počítaný sloupec

| PŘIDAT<column_description>

Přidání omezení integrity

| PŘIDAT

<omezení integrity_tabulky>

Smazat sloupec

|PUSTIT SLOUPEK Název sloupce

Odstranění omezení integrity

| OMEZENÍ PÁDU Integrity_constraint_name

Povolit nebo zakázat kontrolu omezení integrity

BMSSQLServer

|(KONTROLA|ŽÁDNÁ KONTROLA) OMEZENÍ

{List_of_integrity_constraint_names|VŠE)

Smazat tabulku

DOP TABLE Název_tabulky



Dále se podíváme na to, jak deklarovat deklarativní omezení integrity při vytváření nových tabulek pomocí příkazu CREATETABLE nebo při změně struktury existujících tabulek pomocí příkazu ALTERTABLE (podrobněji jsou popsány v části 4.2).

1. Povinná dostupnost dat (hodnoty NULL)

Deklarováno slovem NULL (sloupec může mít prázdné buňky) nebo NOT NULL (povinný sloupec). Výchozí hodnota je NULL.

Příklad vytvoření tabulky 7:

VYTVOŘITTABULKA Klienti (

ClientName NVARCHAR(60) NENÍ NULL,

Datum narození DATUM NULL,

Telefon CHAR(12));

2. Výchozí hodnota (VÝCHOZÍ)

Pro každý sloupec tabulky lze nastavit výchozí hodnotu. Pokud je buňka upravena a její nová hodnota není určena, server vloží výchozí hodnotu. Výchozí hodnota může být NULL, konstanta, vyhodnocený výraz nebo systémová funkce.

Podívejme se na příklad vytvoření tabulky Objednávky(Objednávky). Sloupec Datum objednávky výchozí je aktuální datum a sloupec Množství(množství) výchozí hodnota 0.

VYTVOŘIT TABULKU Objednávky (

OrderNum INT NE NULL, -- číslo objednávky

Datum objednávky DATETIME NE NULL-- datum objednávky

VÝCHOZÍ GetDate()

Funkce GetDate() vrací aktuální datum 8

Množství SMALLINT NE NULL-- množství zboží, VÝCHOZÍ 0);

3. Deklarace primárních klíčů (PRIMARYKEY)

Jednoduchý primární klíč je při vytváření tabulky deklarován slovy PRIMARYKEY. Například,

VYTVOŘITTABULKA Personál( -- tabulka "Zaměstnanci"

TabNum INTPRIMÁRNÍKLÍČ, -- primární klíč

WName NVARCHAR(40) NENULL, -- celé jméno

... -- popis dalších sloupců);

Složený primární klíč je deklarován jinak:

-- metoda 1 (adPKpři vytváření tabulky)

VYTVOŘIT TABULKU Klienti (

PassSeria ČÍSELNÉ(4,0)NE NULL,-- série pasy

PasNumber ČÍSELNÉ(6,0)NE NULL,-- číslo pasy

Jméno NVARCHAR(40)NE NULL,

Telefon CHAR(12),

-- deklarace složeného primárního klíče

OMEZENÍ Klienti_PK

PRIMÁRNÍ KLÍČ(PasSeria,PasNumber));

-- metoda 2(PKdeklarováno po vytvoření tabulky)

-- nejprve vytvořte tabulku bezPK

VYTVOŘIT TABULKA Klienti (

PassSeria ČÍSELNÉ(4,0)NE NULL,--série pasy

PasNumber ČÍSELNÉ(6,0)NE NULL,--číslo pasy

ClientName NVARCHAR(40)NE NULL,

Telefon CHAR(12));

-- modifikace tabulkypřidat RK

ZMĚNIT TABULKA klienti

PŘIDAT OMEZENÍ Klienti_PK

PRIMÁRNÍ KLÍČ(PasSeria,PasNumber);

4. Jedinečnost sloupů (UNIKÁTNÍ)

Jako Primární Klíč označuje, že sloupec nebo skupina sloupců nemůže obsahovat duplicitní hodnoty, ale není PK. Všechny sloupce deklarované jako UNIKÁTNÍ musí být NOTNULL. Příklad jednoduché deklarace jedinečného sloupce:

VYTVOŘIT TABULKU studenti(

SCode INT PRIMÁRNÍ KLÍČ, -- náhradní RK

FIO NVARCHAR(40) NE NULL, -- celé jméno

Záznamová kniha CHAR(6) NE NULL UNIKÁTNÍ); -- Číslo záznamu

Příklad deklarace složeného jedinečného pole:

VYTVOŘIT TABULKA Personál(-- tabulka " Dělníci"

TabNum INT PRIMÁRNÍ KLÍČ, -- časový list číslo

WName NVARCHAR(40) NENÍ NULL, -- Celé jméno

PassSeria ČÍSELNÉ(4,0) NENÍ NULL, -- série pasy

PasNumber ČÍSELNÉ(6,0) NENÍ NULL, -- číslo pasy

-- oznámení kompozitní unikátní pole

OMEZENÍ Staff_UNQ UNIKÁTNÍ(PasSeria,PasNumber));

5. Omezení na hodnoty sloupec (KONTROLA)

Toto omezení vám umožňuje určit rozsah, seznam nebo „masku“ logicky platných hodnot pro sloupec.

Příklad vytvoření tabulky Dělníci(dělníci):

VYTVOŘITTABULKA Dělníci (

-- 4místná personální čísla

TabNum INT PRIMÁRNÍ KLÍČ

KONTROLA(TabNum MEZI 1000 A 9999),

Jméno VARCHAR(60) NENÍ NULL, -- Celé jméno zaměstnanec

-- patrodopis " m" nebo " a"

Gentry CHAR(1) NENÍ NULL

KONTROLA(Gentry V("m", "f")),

Věk minimálně 14 let

Stáří SMALLINT NE NULL KONTROLA(Věk>=14),

-- Číslo certifikátu důchodového pojištění (podle masky)

PensionCert CHAR(14)

KONTROLA(PensionSert JAKO ""));

Tento příklad ukazuje různé typy kontrol. Rozsah přijatelných hodnot je označen konstrukcí BETWEEN…AND; normální podmínky (jako u kolony Stáří) použijte srovnávací znaky =,<>, >, >=, <, <=, связанные при необходимости логическими операциямиAND,OR,NOT(например,Stáří>=14AND Stáří<=70); для указания списка допустимых значений используется предикатINи его отрицаниеNOTIN; конструкция

JAKO maska_povolené_hodnoty KROMĚ seznam_výjimek

slouží k nastavení masky platných hodnot pro sloupce řetězce. Maska používá dva speciální znaky: „%“ je libovolný podřetězec a „_“ je libovolný jednotlivý znak. Klauzule EXCEPT je volitelná.

Podmínka výběru CHECK může porovnávat hodnoty dvou sloupců stejné tabulky a sloupců různých tabulek.

Takže jsme se seznámili s datovými typy, nyní vylepšíme tabulky pro naše fórum. Nejprve se na ně podíváme. A začněme tabulkou uživatelů. Máme v něm 4 sloupce:

Id_user jsou celočíselné hodnoty, což znamená, že typ bude int, omezme to na 10 znaků - int (10).
name je hodnota řetězce varchar, omezme jej na 20 znaků - varchar(20).
email je hodnota řetězce varchar, omezme ji na 50 znaků - varchar(50).
heslo je hodnota řetězce varchar, omezíme jej na 15 znaků - varchar(15).

Všechny hodnoty polí jsou povinné, což znamená, že musíte přidat typ NOT NULL.

Id_user int (10) NOT NULL
jméno varchar(20) NOT NULL
email varchar(50) NOT NULL

První sloupec, jak si pamatujete z konceptuálního modelu naší databáze, je primární klíč (to znamená, že jeho hodnoty jsou jedinečné a jednoznačně identifikují záznam). Samostatně je možné sledovat jedinečnost, ale není to racionální. V SQL pro to existuje speciální atribut - AUTO_INCREMENT, který při přístupu k tabulce pro přidání dat vypočítá maximální hodnotu tohoto sloupce, výslednou hodnotu zvýší o 1 a zapíše ji do sloupce. V tomto sloupci se tedy automaticky generuje jedinečné číslo, a proto je typ NOT NULL nadbytečný. Pojďme tedy ke sloupci s primárním klíčem přiřadit atribut:


jméno varchar(20) NOT NULL
email varchar(50) NOT NULL
heslo varchar(15) NOT NULL

Nyní musíme určit, že pole id_user je primární klíč. K tomu SQL používá klíčové slovo PRIMÁRNÍ KLÍČ(), název klíčového pole je uveden v závorkách. Pojďme provést změny:

Id_user int (10) AUTO_INCREMENT
jméno varchar(20) NOT NULL
email varchar(50) NOT NULL
heslo varchar(15) NOT NULL
PRIMÁRNÍ KLÍČ (id_user)

Tabulka je tedy hotová a její finální verze vypadá takto:

Vytvořit uživatele tabulky (
id_user int (10) AUTO_INCREMENT,
jméno varchar(20) NOT NULL,
email varchar(50) NOT NULL,
heslo varchar(15) NOT NULL,
PRIMÁRNÍ KLÍČ (id_user)
);

Nyní se podíváme na druhou tabulku – témata. Pokud argumentujeme podobně, máme následující pole:



id_author int (10) NOT NULL
PRIMÁRNÍ KLÍČ (id_topic)

Ale v našem databázovém modelu je pole id_author cizí klíč, tzn. může mít pouze hodnoty, které jsou v poli id_user tabulky users. Aby to bylo v SQL uvedeno, existuje klíčové slovo CIZÍ KLÍČ(), který má následující syntaxi:

CIZÍ KLÍČ (název_sloupce_který_je_cizí_klíč) REFERENCE název_nadřazené_tabulky (název_nadřazeného_sloupce);

Ukažme, že id_author je cizí klíč:

Id_topic int (10) AUTO_INCREMENT
topic_name varchar(100) NOT NULL
id_author int (10) NOT NULL
PRIMÁRNÍ KLÍČ (id_topic)
CIZÍ KLÍČ (id_author) REFERENCE uživatelé (id_user)

Tabulka je hotová a její finální verze vypadá takto:

Vytvořte témata tabulek (
id_topic int (10) AUTO_INCREMENT,
topic_name varchar(100) NOT NULL,

PRIMÁRNÍ KLÍČ (id_topic),
CIZÍ KLÍČ (id_author) REFERENCE uživatelé (id_user)
);

Poslední zbylá tabulka jsou příspěvky. Všechno je zde podobné, pouze dva cizí klíče:

Vytvořit příspěvky ke stolu (
id_post int (10) AUTO_INCREMENT,
text zprávy NOT NULL,
id_author int (10) NOT NULL,
id_topic int (10) NOT NULL,
PRIMÁRNÍ KLÍČ (id_post),
CIZÍ KLÍČ (id_author) REFERENCE uživatelé (id_user),
CIZÍ KLÍČ (id_topic) REFERENCE topics (id_topic)
);

Vezměte prosím na vědomí, že tabulka může mít několik cizích klíčů, ale v MySQL může být pouze jeden primární klíč. V první lekci jsme smazali naši databázi fóra, je čas ji znovu vytvořit.

Spustíme MySQL server (Start - Programy - MySQL - MySQL Server 5.1 - MySQL Command Line Client), zadáme heslo, vytvoříme databázové fórum (vytvořit databázové fórum;), vybereme jej k použití (použít fórum;) a vytvoříme naše tři tabulky:

Vezměte prosím na vědomí, že jeden příkaz lze zapsat na několik řádků pomocí klávesy Enter (MySQL automaticky nahradí znak nového řádku ->) a teprve za oddělovačem (středníkem) se stisknutím klávesy Enter provede dotaz.

Pamatujte, že pokud jste něco udělali špatně, vždy můžete tabulku nebo celou databázi zrušit pomocí příkazu DROP. Oprava něčeho na příkazovém řádku je extrémně nepohodlná, takže někdy (zejména v počáteční fázi) je snazší napsat dotazy v některém editoru, například Notepad, a poté je zkopírovat a vložit do černého okna.

Takže tabulky jsou vytvořeny, abychom se o tom ujistili, připomeňme si tým zobrazit tabulky:

A nakonec se podívejme na strukturu naší tabulky posledních příspěvků:

Nyní jsou významy všech polí struktury jasné, kromě pole DEFAULT. Toto je pole výchozí hodnoty. Mohli bychom zadat výchozí hodnotu pro některý sloupec (nebo všechny). Pokud bychom například měli pole s názvem „Ženatý“ a zadali ENUM („ano“, „ne“), pak by dávalo smysl nastavit jednu z hodnot jako výchozí. Syntaxe by byla:

Manželský výčet ("ano", "ne") NENÍ NULL výchozí ("ano")

Tito. toto klíčové slovo se zapisuje za datovým typem mezerou a výchozí hodnota je uvedena v závorkách.

Ale vraťme se k našim stolům. Nyní musíme zadat data do našich tabulek. Na webech většinou zadáváte informace do nějakých html formulářů, pak skript v nějakém jazyce (php, java...) tato data z formuláře vytáhne a vloží do databáze. Dělá to pomocí SQL dotazu pro zadávání dat do databáze. Zatím nevíme, jak psát skripty v PHP, ale nyní se naučíme, jak posílat SQL dotazy pro zadávání dat.

K tomuto účelu slouží operátor VLOŽIT. Můžete použít dva typy syntaxe. První možnost se používá k zadání dat do všech polí tabulky:

INSERT INTO název_tabulky VALUES ("hodnota_prvního_sloupce","hodnota_druhého_sloupce", ..., "hodnota_posledního_sloupce");


Zkusme přidat do tabulky uživatelů následující hodnoty:

INSERT INTO users VALUES ("1","sergey", " [e-mail chráněný]", "1111");

Druhá možnost se používá k zadávání dat do některých polí tabulky:

INSERT INTO název_tabulky ("název_sloupce", "název_sloupce") VALUES ("hodnota_prvního_sloupce","hodnota_druhého_sloupce");


V naší tabulce uživatelů jsou všechna pole povinná, ale naše první pole má klíčové slovo AUTO_INCREMENT (tj. je vyplněno automaticky), takže tento sloupec můžeme přeskočit:

INSERT INTO users (jméno, email, heslo) VALUES ("valera", " [e-mail chráněný]", "2222");

Pokud bychom měli pole s typem NULL, tzn. volitelné, mohli bychom je také ignorovat. Pokud se však pokusíte ponechat pole s hodnotou NOT NULL prázdné, server zobrazí chybovou zprávu a požadavek nedokončí. Při zadávání dat navíc server kontroluje vztahy mezi tabulkami. Proto nebudete moci přidat hodnotu do pole, které je cizím klíčem, který neexistuje v související tabulce. To si ověříte zadáním údajů do zbývajících dvou tabulek.

Nejprve však přidáme informace o několika dalších uživatelích. Chcete-li přidat několik řádků najednou, stačí uvést závorky s hodnotami oddělenými čárkami:

Nyní zadáme údaje do druhé tabulky – témata. Všechno je stejné, ale musíme si uvědomit, že hodnoty v poli id_author musí být přítomny v tabulce uživatelů:

Nyní zkusme přidat další téma, ale s id_author, které není v tabulce uživatelů (protože jsme do tabulky uživatelů přidali pouze 5 uživatelů, id=6 neexistuje):

Server vyvolá chybu a řekne, že nemůže zadat takový řádek, protože pole, které je cizím klíčem, obsahuje hodnotu, která není v tabulce souvisejících uživatelů.

Nyní přidáme pár řádků do tabulky příspěvků, přičemž si pamatujme, že v ní máme 2 cizí klíče, tzn. id_author a id_topic, které zadáme, musí být přítomny v tabulkách s nimi spojených:

Máme tedy 3 tabulky, ve kterých jsou data. Nabízí se otázka – jak vidět, jaká data jsou v tabulkách uložena. To je to, co budeme dělat v příští lekci.




Nahoru