PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thiết kế cơ sở dữ liệu để ghép nối thực thi ràng buộc

Tôi không biết liệu điều này có thể hoạt động trên Postgress hay không, nhưng đây là một giải pháp 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

- bạn chỉ có thể chèn người chơi theo từng cặp hoàn chỉnh

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

Bạn có thể thử chèn một người chơi hoặc xóa một người chơi khỏi đội hoặc chèn nhiều hơn hai người chơi cho mỗi đội - tất cả đều sẽ thất bại do đã có đầy đủ các ràng buộc.

Lưu ý:thực tiễn trong SQL Server là đặt tên rõ ràng cho tất cả các ràng buộc. Tôi đã không đặt tên cho các ràng buộc của mình để đề phòng trường hợp không tương thích với 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. Thứ tự postgres của các ký tự UTF-8

  2. Làm cách nào để lấy một mục ngẫu nhiên từ cơ sở dữ liệu trong Django / postgreSQL?

  3. Toán tử không tồn tại:integer =integer [] trong một truy vấn với BẤT KỲ

  4. Hàng sẽ không bị xóa vì trình kích hoạt tầng cập nhật hàng này

  5. thiếu mục nhập mệnh đề FROM cho bảng Grupo cakephp