2012-05-03 17 views
9

Jak zadeklarować do Trwałe, że mam tabelę, której klucz podstawowy jest połączeniem dwóch pól?Jak zdefiniować klucz złożony w Persistent

Na przykład załóżmy, że mamy tabelę zawierającą first_name i last_name, następnie w składni SQL Muszę coś takiego:

CONSTRAINT pk_PersonID PRIMARY KEY (first_name,last_name) 

Dzięki,

Odpowiedz

3

Zobacz http://www.yesodweb.com/book/persistent sekcja Wyjątkowość

Person 
    firstName String 
    lastName String 
    age Int 
    PersonName firstName lastName 
    deriving Show 

To definiuje unikalny klucz złożony zarówno z imienia, jak i ostatniej nazwy.

+1

To czyni go wyjątkowym, ale czy jest to klucz podstawowy? –

+0

Domyślnie jest to pole typu integer, które jest kluczem podstawowym i używane wewnętrznie. Dlaczego potrzebujesz określonego klucza głównego? Jeśli naprawdę to robisz, nie sądzę, że możesz to zrobić za pomocą wanilii Trwałe, być może będziesz musiał samemu zakodować stół. –

+1

Używam istniejącej tabeli, która jest współdzielona z istniejącymi aplikacjami ... Wygląda na to, że będę musiał przezwyciężyć to z pewnym obejściem. –

3

Możesz użyć składni Primary <field1> <field2> zgodnie z poniższym kodem.

PrimaryCompositeWithOtherNullableFields 
    foo String  maxlen=20 
    bar String  maxlen=20 
    baz String Maybe 
    Primary foo bar -- THIS LINE -- 
    deriving Eq Show 
    enter code here 

ten kod jest pobierane z jednym z testów w https://github.com/yesodweb/persistent/blob/master/persistent-test/src/CompositeTest.hs#L74

This wiki page objaśnia inny składnię do definiowania wzoru na trwałe. To naprawdę powinno być częścią książki Yesod.

Powiązane problemy