これがPostgressで機能するかどうかはわかりませんが、SQLServerソリューションは次のとおりです。
CREATE TABLE dbo.Teams(TeamID INT NOT NULL PRIMARY KEY);
GO
CREATE TABLE dbo.Players(PlayerID INT NOT NULL PRIMARY KEY,
TeamID INT NOT NULL FOREIGN KEY REFERENCES dbo.Teams(TeamID),
NumberInTeam INT NOT NULL CHECK(NumberInTeam IN (1,2)),
TeamMateID INT NOT NULL,
TeamMatesNumberInTeam INT NOT NULL,
-- if NumberInTeam=1 then TeamMatesNumberInTeam must be 2
-- and vise versa
CHECK(NumberInTeam+TeamMatesNumberInTeam = 3),
UNIQUE(TeamID, NumberInTeam),
UNIQUE(PlayerID, TeamID, NumberInTeam),
FOREIGN KEY(TeamMateID, TeamID, TeamMatesNumberInTeam)
REFERENCES dbo.Players(PlayerID, TeamID, NumberInTeam)
);
INSERT INTO dbo.Teams(TeamID) SELECT 1 UNION ALL SELECT 2;
GO
-プレーヤーは完全なペアでのみ挿入できます
INSERT INTO dbo.Players(PlayerID, TeamID, NumberInTeam, TeamMateID, TeamMatesNumberInTeam)
SELECT 1,1,1,2,2 UNION ALL
SELECT 2,1,2,1,1;
1人のプレーヤーを挿入するか、チームからプレーヤーを削除するか、チームごとに3人以上のプレーヤーを挿入してみてください。制約の完全なセットが原因で、すべて失敗します。
注:SQL Serverの慣例では、すべての制約に明示的に名前を付けます。 Postgresと互換性がない場合に備えて、制約に名前を付けませんでした。