У меня есть две таблицы, tbl_Interview
и tbl_JobSeeker
, отношение между ними - многие ко многим, правила нормализации требуют, чтобы я создал новую таблицу, которую я назвал tbl_Interview_JobSeeker
с первичными ключами двух других таблиц, мой вопрос: если таблица tbl_Interview_JobSeeker
является существует ли в любом случае соединительная таблица, когда я создаю новую строку в таблице tbl_Interview
, чтобы автоматически создать новую строку и в соединительной таблице?
Есть ли способ автоматически добавить новую строку в соединительную таблицу в sql?
Ответы (1)
Я думаю, вы хотели бы использовать хранимую процедуру для создания отношений между JobSeeker и Interview, которые являются независимыми объектами и живут сами по себе. Эта связь «многие ко многим» очень распространена в реляционной реальности. Ниже приведен пример решения отношений в реляционной базе данных. Хотя он использует концепцию Человека и Курса.
Создайте таблицы
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
Создайте хранимые процедуры, используемые для операций CRUD
Это лишь некоторые примеры. Многие из этих типов процедур более сложны для защиты от неполных, неточных и/или недействительных данных.
Кроме того, само собой разумеется, что есть много альтернатив этому подходу и много споров о том, к чему относятся эти типы проверок. Просто знайте, что это один подход.
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
Создайте образцы данных
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
Добавить несколько курсов
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
Запросить данные
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;
И результаты
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
uniqueidentifier
правильно ли это предположение? - person Mr.Toxy   schedule 18.06.2016varchar
для электронной почты, но включил столбецid
, который уникален для всех пользователей. - person Tim Biegeleisen   schedule 18.06.2016tbl_Interview_JobSeeker
только тогда, когда новая строка также добавляется вtbl_Interview
. Итак, допустим, что интервью было создано с пользователем 1 и идентификатором интервью 2, вtbl_Interview_JobSeeker
должна быть добавлена строка с UserID = 1 и InterviewID = 2, и это происходит каждый раз, когда в таблицу интервью добавляется новая строка. - person Mr.Toxy   schedule 18.06.2016insert
, которая выполняет обе вставки. Таким образом, вам нужно будет сделать только один вызов, и вам не придется совершать какие-то беспорядочные триггерные действия. - person jkdba   schedule 18.06.2016