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

Jak stworzyć tabelę Postgres z unikalnym połączonym kluczem podstawowym?

Utwórz unikalny indeks:

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

Nie może być UNIQUE lub PRIMARY KEY ograniczenie, ponieważ działają one tylko z kolumnami, a nie wyrażeniami.

Możesz dodać serial kolumna, która ma służyć jako PK, ale mając tylko dwie kolumny z liczbami całkowitymi, oryginalny PK jest również bardzo wydajny (patrz komentarze). I sprawia, że ​​obie kolumny są NOT NULL automatycznie. (W przeciwnym razie dodaj NOT NULL ograniczenia.)

Możesz również dodać CHECK ograniczenie, aby wykluczyć graczy grających przeciwko sobie:

CHECK (winner <> loser)

Wskazówka:aby wyszukać parę identyfikatorów (gdzie nie wiesz, kto wygrał), wbuduj te same wyrażenia do zapytania, a zostanie użyty indeks:

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

Jeśli masz do czynienia z nieznanymi parametrami i nie wiesz z wyprzedzeniem, który z nich jest większy:

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);

Opakowanie CTE służy tylko do wygodnego wprowadzania parametrów tylko raz i nie jest konieczne w niektórych kontekstach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odmowa pozwolenia dla związku

  2. PostgreSQL — musi występować w klauzuli GROUP BY lub być używany w funkcji agregującej

  3. zaktualizuj zapytanie z połączeniem na dwóch stołach

  4. pg gem '0.14.0' w Mountain Lion nie działa

  5. Postgresql:Jak znaleźć plik pg_hba.conf w systemie Mac OS X?