PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Desain basis data untuk pemasangan kendala penegakan

Saya tidak tahu apakah ini dapat bekerja di Postgress, tetapi ini adalah solusi 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

-- Anda hanya dapat memasukkan pemain dalam pasangan lengkap

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

Anda dapat mencoba memasukkan satu pemain, atau menghapus pemain dari tim, atau memasukkan lebih dari dua pemain per tim - semuanya akan gagal karena serangkaian batasan yang lengkap.

Catatan:praktik di SQL Server adalah memberi nama semua batasan secara eksplisit. Saya tidak menyebutkan batasan saya untuk berjaga-jaga jika itu tidak kompatibel dengan Postgres.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy with_for_update penguncian baris tidak berfungsi?

  2. Postgres INTERVAL menggunakan nilai dari tabel

  3. Bagaimana cara menanyakan array bersarang di kolom postgres json?

  4. Perlu mengubah penggabungan Oracle menjadi kueri ke PostgreSQL

  5. Instal PostgreSQL di Ubuntu 18.04