Hubungan luar negeri SQL Server pada kunci utama dua kolom

Saya memiliki tiga tabel contoh berikut (demo yang disederhanakan untuk tujuan pertanyaan):

CREATE TABLE Teams 
(
    Id int IDENTITY(1,1) NOT NULL,
    Name varchar(50) NOT NULL,
    PRIMARY KEY (Id)
)

CREATE TABLE TeamGroups 
(
    Id int NOT NULL,
    TeamId int NOT NULL,
    PRIMARY KEY (Id,TeamId)
)

CREATE TABLE RoomBookings
(
    Id int NOT NULL,
    TeamGroupId int NOT NULL,
    RoomId int NOT NULL,
    PRIMARY KEY (Id)
)

dan saya sudah menyiapkan kunci asing berikut:

ALTER TABLE TeamGroups WITH CHECK
ADD CONSTRAINT [FK_TeamGroups_Teams] 
    FOREIGN KEY (TeamId) REFERENCES Teams(Id)

Idenya adalah bahwa setiap Team dapat bernilai nol atau lebih TeamGroups, dan setiap TeamGroup dapat memiliki nol atau lebih RoomBookings

Untuk mencerminkan hal itu, saya ingin menambahkan kunci asing dari tabel RoomBookings ke dalam tabel TeamGroups.

Saya mencoba menggunakan Hubungan GUI di Management Studio untuk membuat kunci asing (tabel kunci utama: TeamGroups.ID, tabel kunci asing: RoomBookings.TeamGroupId) tetapi saya mendapatkan kesalahan:

Kolom dalam tabel 'TeamGroup' tidak cocok dengan kunci utama atau batasan UNIK yang ada

Saya berasumsi itu karena tabel TeamGroups memiliki kunci utama dua kolom?

Saya tidak benar-benar ingin membuat batasan kunci asing dari tabel TeamGroups (misalnya, kuncinya ada di tabel TeamGroups), karena tabel tersebut pada akhirnya akan digunakan oleh tabel lain (seperti EquipmentBookings, GroupManagers, dll).

Ada bantuan?


person Sk93    schedule 19.11.2015    source sumber
comment
Jika kunci utama Anda terdiri dari lebih dari satu kolom, maka semua kunci awal juga harus memiliki semua kolom tersebut - tidak ada jalan lain. Namun saya tidak mengerti mengapa Anda mendapatkan kesalahan ini saat mencoba menautkan TeamGroups ke Team berdasarkan kolom Team.Id.... itu seharusnya berfungsi dengan baik.   -  person marc_s    schedule 19.11.2015
comment
Ini berfungsi dengan baik menghubungkan TeamGroups ke Team. Ini TeamGroups hingga RoomBookings yang gagal.   -  person Sk93    schedule 19.11.2015
comment
Saya telah memperbarui pernyataan yang ditampilkan.. Saya menggunakan Management Studio untuk membuat skrip tetapi merusaknya saat menyalin+menempel. Abaikan SQL sepenuhnya, itu bukan masalahnya - itu ada untuk menunjukkan kunci lain yang sudah ada. Yang ingin saya lakukan adalah menambahkan kunci dari RoomBookings ke TeamGroups.   -  person Sk93    schedule 19.11.2015


Jawaban (1)


Jika kunci utama Anda terdiri dari lebih dari satu kolom, maka semua kunci awal juga harus memiliki semua kolom tersebut - tidak ada jalan lain.

Namun saya tidak mengerti mengapa Anda mendapatkan kesalahan ini saat mencoba menautkan TeamGroups ke Team berdasarkan kolom Team.Id.... itu seharusnya berfungsi dengan baik.

Coba gunakan ini:

ALTER TABLE TeamGroups WITH CHECK 
   ADD CONSTRAINT [FK_TeamGroups_Teams] 
   FOREIGN KEY (TeamId) REFERENCES Teams(Id);

Anda memiliki Teams (yang sama sekali bukan kolom valid di TeamGroups), dan Anda memiliki REFERENCES Teams.id yang salah - harus REFERNCES Teams(Id); (kolom dalam tanda kurung - bukan notasi "titik")

Pembaruan: dari TeamGroups ke RoomBookings - ya.... gunakan kedua kolom dari TeamGroups di tabel RoomBookings Anda - atau apa yang akan menghentikan Anda membuat kolom TeamGroups.Id menjadi INT IDENTITY dan kemudian membuat PK hanya pada ini satu kolom?? Ada alasan bagus untuk itu??

CREATE TABLE TeamGroups 
(
    TeamGroupId int NOT NULL,
    TeamId int NOT NULL,

    PRIMARY KEY (TeamGroupId)
)

ALTER TABLE dbo.RoomBookings
   ADD CONSTRAINT FK_RoomBookings_TeamGroup
   FOREIGN KEY TeamGroupId REFERENCES TeamGroups(TeamGroupId)
person marc_s    schedule 19.11.2015
comment
Grup Tim dapat terdiri dari satu atau lebih Tim. Misalnya, TeamGroup 1 dapat berisi Tim A dan Tim B, artinya akan ada dua baris di TeamGroup, keduanya dengan Id 1, namun dengan nilai berbeda di TeamId. - person Sk93; 19.11.2015
comment
@ Sk93: bisakah suatu tim menjadi bagian dari lebih dari satu grup tim? Jika demikian, maka Anda perlu membuat TeamGroup tabel data yang tepat dan meletakkan tabel hubungan m:n antara Team dan TeamGroup. Jika tidak - jika satu tim hanya menjadi bagian dari satu TeamGroup (atau tidak sama sekali), maka hubungan Anda terbalik - harus dari Team hingga TeamGroups (Team harus memiliki kolom TeamGroupId - bukan sebaliknya) - person marc_s; 19.11.2015
comment
Ya itu bisa. saya akan menyesuaikannya. Terima kasih. - person Sk93; 19.11.2015