sql触发器:在插入之前从另一个表中选择FK
我有两个数据库表sql触发器:在插入之前从另一个表中选择FK,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有两个数据库表 tblTeams:PK TeamID,TeamName tblMatches:PK match id,FK HomeTeam,FK AwayTeam,Score 我正在使用SQL Server 2008,并通过向导从.csv文件导入行。csv中的列为hometeam,awayteam,score。因此,在插入tblMatches之前,我需要一个触发器来查找团队的FK,并在tblMatches中插入外键而不是名称 请帮忙 CREATE TRIGGER tblmatches_Bef
tblTeams
:PK TeamID
,TeamName
tblMatches
:PK match id
,FK HomeTeam
,FK AwayTeam,Score
李>
我正在使用SQL Server 2008,并通过向导从.csv
文件导入行。csv
中的列为hometeam
,awayteam
,score
。因此,在插入tblMatches
之前,我需要一个触发器来查找团队的FK,并在tblMatches
中插入外键而不是名称
请帮忙
CREATE TRIGGER tblmatches_BeforeInsert
ON tblmatches
BEFORE INSERT
AS
BEGIN
INSERT tblmatches
SELECT teamName
FROM tblmatches
WHERE tblTeams.id = ?i dont know here what to insert?
END
好的,对于要在tblMatches上调用的触发器,您需要为该表中的所有列提供值,并且只为该表中的列提供值,这意味着您不能将团队名称传递给触发器,以便可以使用它解析团队ID 如果我要这样做,我只需要创建一个表来按原样插入原始数据,让导入向导将记录写入该表,在该表上定义一个触发器来将记录插入两个派生表,即。tblTeams,TBL匹配。() 我试图编写一个(没有机会验证,因为我没有SQL server)
如果希望在表中使用不同的表示形式,则可能必须实现一个视图,并通过它而不是基表执行插入 比如:
CREATE TABLE realMatches (
MatchID int IDENTITY(1,1) not null, /* Identity? */
HomeTeamID int not null,
AwayTeamID int not null,
Score int not null, /* int? */
constraint PK_realMatches PRIMARY KEY (MatchID),
constraint FK_Matches_HomeTeams (HomeTeamID) references tblTeams (TeamID),
constraint FK_Matches_AwayTeams (AwayTeamID) references tblTeams (TeamID)
)
GO
CREATE VIEW tblMatches
AS
SELECT
MatchID,
ht.TeamName as HomeTeam,
at.TeamName as AwayTeam,
Score
FROM
realMatches m
inner join
tblTeams ht
on
m.HomeTeamID = ht.TeamID
inner join
tblTeams at
on
m.AwayTeamID = at.TeamID
GO
CREATE TRIGGER T_Matches ON tblMatches
INSTEAD OF INSERT
AS
SET NOCOUNT ON
INSERT INTO realMatches (HomeTeamID,AwayTeamID,Score)
SELECT ht.TeamID,at.TeamID,i.Score
FROM
inserted i
inner join
tblTeam ht
on
i.HomeTeam = ht.TeamName
inner join
tblTeam at
on
i.AwayTeam = at.TeamName
您现在可以(假设tblTeams
中存在“一个团队”和“美国团队”):
当然,这(还)不涉及任何试图改变比赛表中球队的更新,也不涉及如果球队在
tblTeam
中还不存在该怎么办,但你还没有问过这些问题。以下是我尝试过的。我不熟悉触发器:)如何使用sql server 2008的导入向导读取.csv
文件。但我认为这不重要。因为触发器将在插入一行时执行,对吗?@user1292656,只是想知道您是否使用任何高级语言来解析CSV并插入记录。嗯,所以我必须在插入后使用。你能帮我扳机吗?@user1292656,我试着按照问题中的细节写一个。您可能需要相应地验证和使用它。我收到一个错误消息207,级别16,状态1,过程过程,第46行无效列名“score”。@user1292656,这是因为我应该使用插入的表从团队获取当前记录的分数。编辑了我的触发器定义。请现在检查。嗯,还是出了点问题。Msg 4104,级别16,状态1,程序过程,第46行,无法绑定多部分标识符“i.score”。
CREATE TABLE realMatches (
MatchID int IDENTITY(1,1) not null, /* Identity? */
HomeTeamID int not null,
AwayTeamID int not null,
Score int not null, /* int? */
constraint PK_realMatches PRIMARY KEY (MatchID),
constraint FK_Matches_HomeTeams (HomeTeamID) references tblTeams (TeamID),
constraint FK_Matches_AwayTeams (AwayTeamID) references tblTeams (TeamID)
)
GO
CREATE VIEW tblMatches
AS
SELECT
MatchID,
ht.TeamName as HomeTeam,
at.TeamName as AwayTeam,
Score
FROM
realMatches m
inner join
tblTeams ht
on
m.HomeTeamID = ht.TeamID
inner join
tblTeams at
on
m.AwayTeamID = at.TeamID
GO
CREATE TRIGGER T_Matches ON tblMatches
INSTEAD OF INSERT
AS
SET NOCOUNT ON
INSERT INTO realMatches (HomeTeamID,AwayTeamID,Score)
SELECT ht.TeamID,at.TeamID,i.Score
FROM
inserted i
inner join
tblTeam ht
on
i.HomeTeam = ht.TeamName
inner join
tblTeam at
on
i.AwayTeam = at.TeamName
INSERT INTO tblMatches (HomeTeam,AwayTeam,Score)
VALUES ('A Team','Team America',19)