0

2つのデータベーステーブルがあります。

  1. tblTeamsPK TeamIDTeamName
  2. tblMatchesPK match id、、。FK HomeTeam_FK AwayTeam,Score

SQL Server 2008を使用しており、ウィザードを介して.csvファイルから行をインポートしています。の列csvhometeam、、、awayteamですscore。したがって、に挿入する前に、チームのFKを見つけて、名前ではなく外部キーにtblMatches挿入するトリガーが必要です。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
4

2 に答える 2

0

AFAIK、トリガーをtblMatchesで呼び出すには、そのテーブルのすべての列とそのテーブルの列のみに値を指定する必要があります。つまり、トリガーにチーム名を渡して、次の目的で使用できるようにすることはできません。チームIDを解決します。

それを行う場合は、生データをそのまま挿入するテーブルを作成し、インポートウィザードでこのテーブルにレコードを書き込み、このテーブルにトリガーを定義して、2つの派生テーブルにレコードを挿入します。tblTeams、tblMatches。(SQL Serverトリガー

作成しようとしました(SQLサーバーがないため、確認する機会がありませんでした)

CREATE TRIGGER teams.process ON teams
AFTER INSERT
AS
BEGIN
    DECLARE @homeTeamId INT
    DECLARE @awayTeamId INT
    DECLARE @maxTeamId INT
    DECLARE @matchId INT

    SELECT @maxTeamId = 0
    SELECT @maxTeamId = ISNULL(MAX(teamId), 0) from tblTeams

    --- Check if home team has already been inserted into the table.
    SELECT @homeTeamId = -1
    SELECT 
        @homeTeamId = teamId 
    FROM 
        tblTeams t
        JOIN inserted i
        ON t.teamName = i.hometeam
    IF (@homeTeamId = -1) 
    BEGIN
        SELECT @homeTeamId = @maxTeamId + 1
        SELECT @maxTeamId = @maxTeamId + 1
        INSERT INTO tblTeams SELECT @homeTeamId, i.hometeam FROM inserted i
    END

    --- Check if away team has already been inserted into the table.
    SELECT @awayTeamId = -1
    SELECT 
        @awayTeamId = teamId 
    FROM 
        tblTeams t
        JOIN inserted i
        ON t.teamName = i.awayteam
    IF (@awayTeamId = -1) 
    BEGIN
        SELECT @awayTeamId = @maxTeamId + 1
        SELECT @maxTeamId = @maxTeamId + 1
        INSERT INTO tblTeams SELECT @awayTeamId, i.awayteam FROM inserted i
    END

    -- insert a record into the matches table with the home team ID and away team ID.
    SELECT @matchId = 0
    SELECT @matchId = ISNULL(MAX(MatchId), 0) FROM tblMatches
    INSERT INTO tblMatches 
    SELECT @matchId + 1, @homeTeamId, @awayTeamId, i.score 
    FROM inserted i
END 
于 2012-09-11T17:48:44.980 に答える
0

テーブルに別の表現が必要な場合は、おそらくビューを実装し、ベース テーブルではなくビューを介して挿入を実行する必要があります。

何かのようなもの:

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

次のことができます (「A Team」と「Team America」が に存在すると仮定tblTeams):

INSERT INTO tblMatches (HomeTeam,AwayTeam,Score)
VALUES ('A Team','Team America',19)

もちろん、これは (まだ) マッチ テーブルのチームを変更しようとする更新には対応していません。また、チームがまだ に存在しない場合の対処方法もありませんがtblTeam、それらについてはまだ質問していません。

于 2012-09-11T18:29:59.667 に答える