插入过程检查外键是否存在于另一个表中

时间:2017-12-20 02:49:22

标签: tsql stored-procedures

我遇到了一个我应该创建存储过程的问题。但是我的存储过程需要检查列是否存在于不同的表中,这是我目前的代码:

 CREATE PROCEDURE InsertTrail ( 
 @Mount             int,
 @Skill             varchar(20),
 @Snow              int,
 @Lift              int, 
 @Open              char(3),
 @AmountReal        int,
 @AmountFake        int,
 @Name              varchar(50)
  )
AS 
BEGIN 
If not exists (select mountainid from MOUNTAIN where @mount = mountainid) 
and
If not exists (select skilllevel from SKILLLEVEL where @skill = SkillLevel)
and 
If not exists (select snowmakerID from SNOWMAKER where @snow = SnowMakerID)
and
If not exists (select liftID from LIFT where @lift = LiftID)
BEGIN
    INSERT INTO TRAIL (MountainID, SkillLevel, SnowMakerID, LiftID, TOpen, AmountRealSnow, AmountFakeSnow, TrailName)
    values
    (@Mount, @Skill, @Snow, @Lift, @Open, @AmountReal, @AmountFake, @Name)
    Return @@Identity 
END
END

我需要确保存在的列是山地桌上的山地车,SKILLLEVEL桌上的技巧级别,​​雪地里的雪地车和升降台中的liftID。

如果您需要更多信息,请告诉我们!如果可以,请帮忙!

1 个答案:

答案 0 :(得分:0)

目前,只有在不存在这些值时才会插入您的值。如果您想在插入前检查所有值是否存在,则应使用IF EXISTS代替IF NOT EXISTS

但是,我认为最简单的方法是创建外键并让数据库管理员处理此验证。

我假设您的示例代码的语法为SQL SERVER。如果我更改查询错误,请更正我:

ALTER TABLE TRAIL
ADD CONSTRAINT [FK_TRAIL_MOUNTAIN] FOREING KEY [MountainID]
REFERENCES [MOUNTAIN] ([MountainID])

ALTER TABLE TRAIL
ADD CONSTRAINT [FK_TRAIL_SKILLLEVEL] FOREING KEY [SkillLevel]
REFERENCES [SKILLLEVEL] ([SkillLevel])

ALTER TABLE TRAIL
ADD CONSTRAINT [FK_TRAIL_SNOWMAKER] FOREING KEY [SnowMakerID]
REFERENCES [SNOWMAKER] ([SnowMakerID])

ALTER TABLE TRAIL
ADD CONSTRAINT [FK_TRAIL_LIFT] FOREING KEY [LiftID]
REFERENCES [LIFT] ([LiftID])

另外IMO你也应该在客户端检查这些值,并在没有引用值时让你的SP“崩溃”。