限制记录数取决于主键的部分

Kub*_*icz 1 database-design sql-server constraint

我为足球比赛创建了数据库。

我有 2 个具有多对多关系的表,因此我还创建了一个连接表:

裁判

CREATE TABLE referee (
  id_referee INT IDENTITY PRIMARY KEY,
  id_type_referee INT NOT NULL,
  first_name varchar(20) NOT NULL,
  last_name varchar(30) NOT NULL,
  date_of_birth DATE NOT NULL,
  FOREIGN KEY(id_type_referee) REFERENCES type_referee(id_type_referee)
);
Run Code Online (Sandbox Code Playgroud)

比赛

CREATE TABLE match (
  id_match INT IDENTITY PRIMARY KEY,
  id_stadium INT NOT NULL REFERENCES stadium(id_stadium),
  id_season INT NOT NULL REFERENCES season(id_season),
  date_of_match DATE NOT NULL,
  audience INT CHECK (audience>=0)
);
Run Code Online (Sandbox Code Playgroud)

接线台

CREATE TABLE match_referee(
  id_referee INT NOT NULL,
  id_match INT NOT NULL,
  PRIMARY KEY(id_referee,id_match),
  FOREIGN KEY (id_referee) REFERENCES referee(id_referee),
  FOREIGN KEY (id_match) REFERENCES match(id_match)
);
Run Code Online (Sandbox Code Playgroud)

我想将单场比赛的裁判人数限制为三人。我怎样才能做到这一点?

Dan*_*man 5

我想将单场比赛的裁判人数限制为三人,我该怎么做?

一种方法是使用触发器:

CREATE TRIGGER tr_match_referee
ON dbo.match_referee
FOR INSERT, UPDATE AS
IF EXISTS(
    SELECT 1
    FROM inserted
    JOIN dbo.match_referee WITH (READCOMMITTEDLOCK) ON
        match_referee.id_match = inserted.id_match
    GROUP BY match_referee.id_match
    HAVING COUNT(*) > 3
    )
BEGIN
    RAISERROR('No more than 3 referees allowed per match', 16, 1);
END;
Run Code Online (Sandbox Code Playgroud)

另一种方法是在每场比赛中添加一个具有唯一裁判编号的列以及唯一和检查约束。在为比赛分配裁判时,您需要分配裁判编号。

ALTER TABLE dbo.match_referee
    ADD match_referee_number int NOT NULL
    CONSTRAINT CK_match_referee_match_referee_number
    CHECK (match_referee_number BETWEEN 1 AND 3);
ALTER TABLE dbo.match_referee
    ADD CONSTRAINT UN_match_referee_id_match_match_referee_number
    UNIQUE(id_match, match_referee_number);
Run Code Online (Sandbox Code Playgroud)