0

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?

+0

Sie könnten einen Trigger erstellen, die die Verknüpfungstabelle auf der anderen Tabelle nach Einsatz aktualisiert. Welche Version von SQL verwenden Sie? –

+1

Ich benutze SQL Express 2014. Ich müsste auch E-Trigger erstellen, um korrekt zu löschen? –

+0

Nein. SQL Server verfügt über eine Kaskadenlöschung, sodass die Bereinigung möglicherweise nicht zu viel Mühe bereitet. –

Antwort

0

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