Ich habe zwei Tabellen, tbl_Interview
und tbl_JobSeeker
die Beziehung zwischen den beiden ist viele zu viele, die Normalisierungsregeln erfordern, dass ich eine neue Tabelle erstellen, die ich tbl_Interview_JobSeeker
mit den anderen beiden Tabellen Primärschlüssel aufgerufen habe, ist meine Frage: Wenn die Tabelle tbl_Interview_JobSeeker
Ist eine Junction-Tabelle sowieso vorhanden, wenn ich eine neue Zeile in der Tabelle tbl_Interview
anlege, um automatisch auch eine neue Zeile in der Junction-Tabelle zu erstellen?Gibt es eine Möglichkeit, automatisch eine neue Zeile in eine Junction-Tabelle in SQL hinzuzufügen?
Gibt es eine Möglichkeit, automatisch eine neue Zeile in eine Junction-Tabelle in SQL hinzuzufügen?
Antwort
Ich denke, dass Sie eine gespeicherte Prozedur verwenden möchten, um die Beziehung zwischen dem JobSeeker und dem Interview zu erstellen, die unabhängige Entitäten sind und eigenständig leben. Diese Viele-zu-Viele-Beziehung ist in der Beziehungsrealität sehr häufig. Im Folgenden finden Sie ein Beispiel für die Behandlung der Beziehung in einer relationalen Datenbank. Obwohl es das Konzept von Person und Kurs verwendet.
Erstellen Sie die Tabellen
create table Person (
PersonId int identity(1, 1)
primary key clustered,
FirstName varchar(128),
LastName varchar(128))
create table Course (
CourseId int identity(1, 1)
primary key clustered,
CourseName varchar(128) unique);
create table PersonCourse (
PersonId int not null
references Person(PersonId),
CourseId int not null
references Course(CourseId),
primary key clustered (PersonId, CourseId));
go
die gespeicherten Prozeduren für CRUD-Operationen. Diese verwendet erstellen
sind nur einige Beispiele Viele dieser Arten von Verfahren sind komplizierter gegen unvollständige, ungenaue und/oder ungültige Daten zu schützen.
Außerdem gibt es natürlich viele Alternativen zu diesem Ansatz und viele Diskussionen darüber, wo diese Arten von Kontrollen gehören. Nur wissen, dass dies ein Ansatz ist.
create proc dbo.CreatePerson
@FirstName varchar(128),
@LastName varchar(128),
@PersonId int = null output
as begin try
set nocount on;
insert Person (FirstName, LastName)
values (@FirstName, @LastName);
set @PersonId = scope_identity();
end try
begin catch
throw;
end catch
go
create proc dbo.CreateCourse
@CourseName varchar(128),
@CourseId int = null output
as begin try
set nocount on;
insert Course(CourseName)
values (@CourseName);
set @CourseId = scope_identity();
end try
begin catch
throw;
end catch
go
create proc dbo.AddCourse
@PersonId int,
@CourseId int
as begin try
set nocount on;
if not exists (
select *
from Person
where PersonId = @PersonId)
throw 50000, 'Person does not exist.', 1;
if not exists (
select *
from Course
where CourseId = @CourseId)
throw 50001, 'Course does not exist.', 1;
insert PersonCourse (PersonId, CourseId)
values (@PersonId, @CourseId);
end try
begin catch
throw;
end catch
go
Erstellen Sie einige Beispieldaten
insert Person (FirstName, LastName)
values
('Bruce', 'Wayne'),
('Clark', 'Kent'),
('Flash', 'Gordon');
insert Course (CourseName)
values
('The History of Spandex'),
('Super Hero Physics'),
('Rocket Ships and the Stuff of Science Fiction');
go
einige Kurse hinzufügen
exec AddCourse 1, 1; -- Bruce wants to take The History of Spandex
exec AddCourse 2, 2; -- Clark wants to take Super Hero Physics
exec AddCourse 3, 1; -- Flash wants to take The History of Spandex
exec AddCourse 3, 3; -- Flash wants to also take Rocket Ships and the Stuff of Science Fiction
Abfrage der Daten
select
pc.PersonId,
p.FirstName,
p.LastName,
c.CourseId,
c.CourseName
from PersonCourse pc
join Person p
on pc.PersonId = p.PersonId
join Course c
on pc.CourseId = c.CourseId;
Und die Ergebnisse
PersonId FirstName LastName CourseId CourseName
----------- ---------- ---------- ----------- -----------------------------------------------
1 Bruce Wayne 1 The History of Spandex
2 Clark Kent 2 Super Hero Physics
3 Flash Gordon 1 The History of Spandex
3 Flash Gordon 3 Rocket Ships and the Stuff of Science Fiction
Sie könnten einen Trigger erstellen, die die Verknüpfungstabelle auf der anderen Tabelle nach Einsatz aktualisiert. Welche Version von SQL verwenden Sie? –
Ich benutze SQL Express 2014. Ich müsste auch E-Trigger erstellen, um korrekt zu löschen? –
Nein. SQL Server verfügt über eine Kaskadenlöschung, sodass die Bereinigung möglicherweise nicht zu viel Mühe bereitet. –