sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan opretter man en Postgres-tabel med en unik kombineret primærnøgle?

Opret et unikt indeks:

CREATE UNIQUE INDEX matches_uni_idx ON matches
   (greatest(winner, loser), least(winner, loser));

Kan ikke være en UNIQUE eller PRIMARY KEY begrænsning, da de kun virker med kolonner, ikke udtryk.

Du kan tilføje en serial kolonne til at tjene som PK, men med kun to heltalskolonner er din originale PK også meget effektiv (se kommentarer). Og det gør begge kolonner NOT NULL automatisk. (Ellers skal du tilføje NOT NULL begrænsninger.)

Du kan også tilføje en CHECK begrænsning for at udelukke spillere, der spiller mod sig selv:

CHECK (winner <> loser)

Tip:For at søge efter et par id'er (hvor du ikke ved, hvem der vandt), indbygg de samme udtryk i din forespørgsel, og indekset vil blive brugt:

SELECT * FROM matches
WHERE  greatest(winner, loser) = 3  -- the greater value, obviously
AND    least(winner, loser) = 1;

Hvis du beskæftiger dig med ukendte parametre, og du ikke ved, hvilken der er størst på forhånd:

WITH input AS (SELECT $id1 AS _id1, $id2 AS _id2)  -- input once
SELECT * FROM matches, input
WHERE  greatest(winner, loser) = greatest(_id1, _id2)
AND    least(winner, loser) = least(_id1, _id2);

CTE-indpakningen er kun for nemheds skyld at indtaste parametre én gang og ikke nødvendig i nogle sammenhænge.



  1. Azure Virtual Machine Developments til SQL Server-brug

  2. Hvordan kan jeg implementere et .NET-program, der bruger ODAC uden at installere hele komponenten til brugeren?

  3. Introduktion til SQL-kommandoer

  4. Database modellering