PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Projekt bazy danych do parowania wymuszający ograniczenia

Nie wiem, czy to zadziała na Postgress, ale oto rozwiązanie SQL Server:

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

-- graczy można wstawiać tylko w pełnych parach

INSERT INTO dbo.Players(PlayerID, TeamID, NumberInTeam, TeamMateID, TeamMatesNumberInTeam)
SELECT 1,1,1,2,2 UNION ALL
SELECT 2,1,2,1,1;

Możesz spróbować wstawić jednego gracza, usunąć gracza z drużyny lub wstawić więcej niż dwóch graczy na drużynę - wszystko się nie powiedzie z powodu pełnego zestawu ograniczeń.

Uwaga:praktyka w SQL Server polega na jawnym nazwaniu wszystkich ograniczeń. Nie wymieniłem swoich ograniczeń na wypadek, gdyby nie były kompatybilne z Postgresem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Replikuj środowisko Pythona na innym komputerze

  2. Użyj zapytania where w typie danych JSONB w Rails Postgres

  3. Postgres w Cloud9

  4. Zmień początkową wartość serialu - Postgresql

  5. postgresql odpowiednik $mysqli->insert_id