sql >> Databáze >  >> RDS >> Sqlserver

Jak vytvořit složený primární klíč v SQL Server (příklad T-SQL)

složený primární klíč je primární klíč skládající se z více sloupců. Microsoft je ve své dokumentaci obvykle označuje jako vícesloupcové primární klíče.

Tento článek poskytuje příklad vytvoření složeného primárního klíče pomocí Transact-SQL v SQL Server.

Složený primární klíč můžete vytvořit stejně, jako byste vytvořili jediný primární klíč, s tím rozdílem, že místo určení pouze jednoho sloupce zadáte název dvou nebo více sloupců oddělených čárkou.

Takhle:

CONSTRAINT PK_Name PRIMÁRNÍ KLÍČ (sloupec1, sloupec2)

Příklad 1 – Vytvoření složeného primárního klíče

Zde je příklad databáze používající složený primární klíč.

Pro účely tohoto příkladu vytvořím databázi s názvem PK_Test :

CREATE DATABASE PK_Test;

Nyní, když je databáze vytvořena, pojďme do toho a vytvořte tabulky.

USE PK_Test;CREATE TABLE Musician (MusicianId int NOT NULL,FirstName varchar(60),LastName varchar(60),CONSTRAINT PK_Musician PRIMARY KEY (MusicianID));CREATE TABLE Kapela (BandId int NOT NULL,BandNachar) ,CONSTRAINT PK_Band PRIMARY KEY (BandId));CREATE TABLE Člen kapely (MusicianId int NOT NULL,BandId int NOT NULL,CONSTRAINT PK_BandMember PRIMÁRNÍ KLÍČ (MusicianID, BandId),CONSTRAINT FK_BandId KEY (dBandM BandId KEY) a CONSTRAINT FK_BandEIBER KEY_Band REGN . KEY (MusicianId) REFERENCE Musician(MusicianId));

V tomto příkladu BandMember tabulka má vícesloupcový primární klíč. V tomto případě je každý sloupec v primárním klíči také cizím klíčem primárního klíče jiné tabulky, ale není to podmínkou.

Důvodem výše uvedeného návrhu databáze je, že hudebník by mohl být potenciálně členem mnoha kapel. Každá kapela může mít také mnoho hudebníků. Takže máme vztah mnoho k mnoha. To je důvod, proč BandMember je vytvořena tabulka – používá se jako křížová referenční tabulka mezi Musician tabulka a Band stůl.

Tento konkrétní případ podporuje složený primární klíč, protože hudebník, který je členem kapely, by měl být jedinečný. Jinými slovy, nechtěli bychom více řad s hudebníkem, který by byl členem stejné kapely. To by narušilo integritu dat. Mohlo by to také způsobit zmatek při pokusu o zachování referenční integrity, i když někdy vytvoříme vztah mezi touto tabulkou a jinou (což zde děláme).

Příklad 2 – Vložení dat

Po spuštění výše uvedeného kódu nyní mohu načíst databázi s daty:

INSERT INTO MusicianVALUES ( 1, 'Ian', 'Paice' ),( 2, 'Roger', 'Glover' ),( 3, 'Richie', 'Blackmore' ),( 4, 'Rod', ' Evans' ),( 5, 'Ozzy', 'Osbourne' );INSERT INTO BandVALUES ( 1, 'Deep Purple' ),( 2, 'Rainbow' ),( 3, 'Whitesnake' ),( 4, 'Iron Maiden ' );INSERT INTO BandMemberVALUES ( 1, 1 ), ( 1, 3 ), ( 2, 1 ), ( 2, 2 ), ( 3, 1 ), ( 3, 2 ), ( 4, 1 ); 

Příklad 3 – Základní dotaz

Nyní, když jsou data v naší databázi, spustíme dotaz a vrátíme některá z těchto dat.

Zde je základní dotaz:

SELECT CONCAT(m.FirstName, ' ', m.LastName) AS 'Musician', b.BandName AS 'Band'FROM Musician mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band =ON bmBandId .BandId AND m.MusicianId =bm.MusicianId;

Výsledek:

+------------------+-------------+| Hudebník | Kapela ||------------------+-------------|| Ian Paice | Deep Purple || Ian Paice | Whitesnake || Roger Glover | Deep Purple || Roger Glover | Duha || Richie Blackmore | Deep Purple || Richie Blackmore | Duha || Rod Evans | Deep Purple |+------------------+-------------+

Takže jak se očekávalo, vrátí se pouze ti hudebníci a kapely, kteří mají záznam v BandMember referenční tabulka.

Příklad 4 – Mírně upravený dotaz

Zde je upravená verze výše uvedeného dotazu, která prezentuje výsledky jiným způsobem:

SELECT b.BandName AS 'Kapela', STRING_AGG(CONCAT(m.FirstName, ' ', m.LastName), ', ') AS 'Musicians'FROM Musician mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJO b ON b.BandId =bm.BandId AND m.MusicianId =bm.MusicianIdGROUP BY b.BandName;

Výsledek:

+-------------+-------------------------------- -----------------------+| Kapela | Hudebníci ||-------------+---------------------------------- ----------------------|| Deep Purple | Ian Paice, Roger Glover, Richie Blackmore, Rod Evans || Duha | Roger Glover, Richie Blackmore || Whitesnake | Ian Paice |+-------------+-------------------------------- ----------------------+

Zde jsou výsledky seskupeny podle kapel a všichni hudebníci pro každou skupinu jsou zobrazeni jako seznam oddělený čárkami v jednom poli.

K tomu používám STRING_AGG() funkce zřetězení hudebníků.

Složený cizí klíč

Problém s výše uvedeným příkladem je, že většina dat je zastaralá. Někteří z těchto hudebníků tyto kapely skutečně opustili. A někteří odešli a později se vrátili.

Jak se s tím můžeme vypořádat?

Mohli bychom vytvořit další referenční tabulku pro zaznamenání časového období, kdy je každý hudebník členem každé kapely. Taková tabulka by musela odkazovat na BandMember tabulky pomocí cizího klíče. A protože tato tabulka má složený primární klíč, museli bychom v nové tabulce, která na ni odkazuje, použít složený cizí klíč.

Příklad viz Jak vytvořit složený cizí klíč v SQL Server. Tento článek používá stejný příklad jako výše, s výjimkou další tabulky se složeným cizím klíčem, která odkazuje na výše uvedený složený primární klíč.


  1. Co bych si měl vybrat - JSON nebo SQLite?

  2. Použití Pythonu a MySQL v procesu ETL:SQLAlchemy

  3. Nové termíny bezplatných certifikačních zkoušek na Oracle Cloud a Autonomous Database

  4. Transformace řádků na sloupce v MySQL