sql >> データベース >  >> RDS >> PostgreSQL

ペアリングを実施する制約のためのデータベース設計

    これが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と互換性がない場合に備えて、制約に名前を付けませんでした。



    1. Mysql:不明な変数、mysqlアプリケーションを実行できない、my.cnfとは関係がないようです

    2. Oracleの実際のテーブルスペースサイズ

    3. 任意のテーブルの現在のAUTO_INCREMENT値を取得します

    4. PHPの多次元配列からMySQLにデータを挿入する