Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak utworzyć złożony klucz obcy w SQL Server (przykład T-SQL)

Złożony klucz obcy to klucz obcy składający się z wielu kolumn.

W tym artykule przedstawiono przykład tworzenia złożonego klucza obcego przy użyciu języka Transact-SQL w programie SQL Server.

Złożony klucz obcy można utworzyć tak, jak tworzy się pojedynczy klucz obcy, z tą różnicą, że zamiast określać tylko jedną kolumnę, należy podać nazwę dwóch lub więcej kolumn oddzielonych przecinkiem.

Tak:

OGRANICZENIE FK_FKName KLUCZ OBCY (FKColumn1, FKColumn2) REFERENCES PrimaryKeyTable (PKColumn1, PKColumn2)

Przykład 1 – Utwórz złożony klucz obcy

Oto przykład bazy danych używającej złożonego klucza obcego (i złożonego klucza podstawowego).

Na potrzeby tego przykładu stworzę bazę danych o nazwie BandTest :

UTWÓRZ BAZĘ DANYCH BandTest;

Teraz, gdy baza danych została utworzona, przejdźmy dalej i utwórzmy tabele.

 USE BandTest;CREATE TABLE Musician (MusicianId int NOT NULL,FirstName varchar(60),LastName varchar(60),CONSTRAINT PK_Musician PRIMARY KEY (MusicianID));CREATE TABLE Band (BandId int NOT NULL,BandName) varchar ,CONSTRAINT PK_Band PRIMARY KEY (BandId));CREATE TABLE BandMember (MusicianId int NOT NULL,BandId int NOT NULL,CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),CONSTRAINT FK_BandMember_KEYBANDIDEIGNANDM (FORENCEBANDEIGN) KLUCZ (MusicianId) REFERENCJE Muzyk (MusicianId));CREATE TABLE Okres członkostwa (MembershipPeriodId int NOT NULL,MusicianId int NOT NULL,BandId int NOT NULL,StartDate date NOT NULL,EndDate date NULL,CONSTRAINTPeriodIDPeriod PK_Membership iCONSTRAINTMembership KLUCZ (MusicianID, BandId) ODNIESIENIA BandMember(MusicianID, BandId));

W tym przykładzie BandMember tabela ma wielokolumnowy klucz podstawowy. MembershipPeriod tabela ma klucz obcy, który odwołuje się do tego wielokolumnowego klucza podstawowego. W związku z tym zarówno definicje klucza podstawowego, jak i obcego zawierają kolumny oddzielone przecinkiem.

Uzasadnieniem powyższego projektu bazy danych jest to, że muzyk może potencjalnie być członkiem wielu zespołów. Ponadto każdy zespół może mieć wielu muzyków. Mamy więc relację „wielu do wielu”. Dlatego BandMember tworzona jest tabela – jest używana jako tabela odniesień między Musician tabela i Band stół. W tym przypadku wybrałem złożony klucz podstawowy.

Ale muzyk może być również członkiem zespołu więcej niż jeden raz (np. muzyk może odejść z zespołu, aby wrócić później). Dlatego MembershipPeriod tabela może służyć do rejestrowania wszystkich okresów, w których każdy muzyk był członkiem każdego zespołu. Musi to odnosić się do złożonego klucza głównego na BandMember tabeli, więc muszę utworzyć wielokolumnowy klucz obcy.

Przykład 2 – Wstaw dane

Po uruchomieniu powyższego kodu mogę teraz załadować bazę danych danymi:

WSTAWIĆ WARTOŚCI MUZYKA ( 1, 'Ian', 'Paice' ),( 2, 'Roger', 'Glover' ),( 3, 'Richie', 'Blackmore' ),( 4, 'Rod', ' Evans' ),( 5, 'Ozzy', 'Osbourne' );INSERT IN BandVALUES ( 1, 'Deep Purple' ),( 2, 'Rainbow' ),( 3, 'Whitesnake' ),( 4, 'Iron Maiden' ' );INSERT IN BandMemberVALUES (1, 1 ),( 1, 3 ),( 2, 1 ),( 2, 2 ),( 3, 1 ),( 3, 2 ),( 4, 1 );INSERT INTO MembershipPeriodVALUES ( 1, 1, 1, '1968-03-01', '1976-03-15' ),( 2, 1, 1, '1984-04-01', NULL ),( 3, 1, 3, '1979-08-01', '1982-01-01'), (4, 2, 1, '1969-01-01', '1973-06-29'), (5, 2, 1, '1984 -04-01', NULL ),( 6, 2, 2, '1979-01-01', '1984-01-01'),( 7, 3, 1, '1968-03-01', '1975 -06-21' ),( 8, 3, 1, '1984-04-01', '1993-11-17' ),( 9, 3, 2, '1975-02-01', '1984-04 -01' ),( 10, 3, 2, '1993-11-17', '1997-05-31' ),( 11, 3, 2, '2015-01-01', NULL ),( 12, 4, 1, '1968-03-01', '1969-12-01');

Przykład 3 – Podstawowe zapytanie

Oto przykład zapytania, które można uruchomić w bazie danych:

 SELECT CONCAT (m.Imię, ' ', m.Nazwisko) AS 'Muzyk', b.BandName AS 'Zespół', mp.StartDate AS 'Początek', mp.EndDate AS 'Koniec'FROM Muzyk mJOIN Członek zespołu bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm.BandId AND m.MusicianId =bm.MusicianIdJOIN Okres członkostwa mpON mp.BandId =b.BandId AND mp.MusicianId =m.
 Wynik:

+-------------------+--------------+---------------+ ------------+| Muzyk | Zespół | Start | Koniec ||------------------+--------------+-------------+- -----------|| Ian Paice | Głęboki Fioletowy | 1968-03-01 | 1976-03-15 || Ian Paice | Głęboki Fioletowy | 1984-04-01 | NULL || Ian Paice | Wąż | 1979-08-01 | 1982-01-01 || Roger Glover | Głęboki Fioletowy | 1969-01-01 | 1973-06-29 || Roger Glover | Głęboki Fioletowy | 1984-04-01 | NULL || Roger Glover | Tęcza | 1979-01-01 | 1984-01-01 || Richie Blackmore | Głęboki Fioletowy | 1968-03-01 | 1975-06-21 || Richie Blackmore | Głęboki Fioletowy | 1984-04-01 | 1993-11-17 || Richie Blackmore | Tęcza | 1975-02-01 | 1984-04-01 || Richie Blackmore | Tęcza | 1993-11-17 | 1997-05-31 || Richie Blackmore | Tęcza | 2015-01-01 | NULL || Rod Evans | Głęboki Fioletowy | 1968-03-01 | 1969-12-01 |+------------------+--------------+---------- --+------------+

Dzięki temu możemy teraz zobaczyć, w jakich dniach każdy muzyk był członkiem każdego zespołu, nawet jeśli był członkiem przy wielu okazjach.

Przykład 4 – Nieco zmodyfikowane zapytanie

Możemy zmodyfikować powyższe zapytanie, aby dostarczyć wyniki w nieco bardziej czytelnym formacie:

 SELECT CONCAT (m.Imię, ' ', m.Nazwisko) AS 'Muzyk', b.BandName AS 'Zespół', STRING_AGG(CONCAT(FORMAT(mp.DataRozpoczęcia, 'rrrr'), '-', ISNULL (FORMAT(mp.EndDate, 'yyyy'), 'obecny')), ', ') AS 'Czas z zespołem'OD Muzyk mJOIN Członek zespołu bm ON m.MusicianId =bm.MusicianIdJOIN Zespół b ON b.BandId =bm .BandId AND m.MusicianId =bm.MusicianIdJOIN MembershipPeriod mpON mp.BandId =b.BandId AND mp.MusicianId =m.MusicianIdGROUP BY m.FirstName, m.LastName, b.BandName;

Wynik:

+-------------------+--------------+----------------- -----------------------+| Muzyk | Zespół | Czas spędzony w zespole ||------------------+--------------+----------- -------------------------|| Ian Paice | Głęboki Fioletowy | 1968-1976, 1984-obecnie || Ian Paice | Wąż | 1979-1982 || Richie Blackmore | Głęboki Fioletowy | 1968-1975, 1984-1993 || Richie Blackmore | Tęcza | 1975-1984, 1993-1997, 2015-obecnie || Rod Evans | Głęboki Fioletowy | 1968-1969 || Roger Glover | Głęboki Fioletowy | 1969-1973, 1984-obecnie || Roger Glover | Tęcza | 1979-1984 |+-------------------+--------------+------------ ------------------------+

Ten przykład wykorzystuje funkcję STRING_AGG() funkcja łączenia różnych okresów czasu dla każdego muzyka. Kończy się to zmniejszeniem liczby wymaganych wierszy i pozwala nam grupować okresy razem w tym samym polu.

Korzystam również z funkcji ISNULL() funkcja, która pozwala mi zmienić dowolne wartości NULL na coś bardziej znaczącego.

Zauważ, że ISNULL() wymaga, aby drugi argument był typu, który można niejawnie przekonwertować na typ pierwszego argumentu. W tym przypadku pierwszym argumentem była pierwotnie data typ, co oznacza, że ​​nie byłbym w stanie użyć napisu. Jednak w tym przypadku zdecydowałem się użyć FORMAT() funkcja formatowania daty wartość. Ta funkcja domyślnie konwertuje datę wartość do ciągu i dlatego mogłem użyć ciągu jako drugiego argumentu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie T-SQL, aby wyświetlić definicję tabeli?

  2. Jak zrozumieć typ danych geograficznych serwera SQL?

  3. Przechowywana procedura i uprawnienia — czy WYKONANIE wystarczy?

  4. Wstaw do... Scal... Wybierz (SQL Server)

  5. Uwaga użytkownicy korzystający z SQL Server 2008 i SQL Server 2008 R2