CREATE TYPE'ın ikinci biçimi yeni bir temel tür oluşturur. Parametrelerin yukarıdaki sırayla belirtilmeleri şart değildir, herhangi bir sırayla belirtilebilirler, ayrıca çoğu isteğe bağlıdır. Bir türü tanımlamadan önce CREATE FUNCTION kullanarak iki veya daha fazla işlev tanımlanmış olmalıdır. Destek işlevleri olan girdi_işlevi ve çıktı_işlevi zorunludur. alış_işlevi, gönderim_işlevi ve analiz_işlevi ise isteğe bağlıdır. Genelde bu işlevler C gibi düşük seviyeli bir dille yazılırlar.
girdi_işlevi türün harici metin gösterimini, bu türü kullanmak için tanımlanmış işleç ve işlevler tarafından kullanılan dahili gösterime çevirir. çıktı_işlevi ise bunun tersini yapar. Girdi işlevi ya cstring türünde tek bir argüman alacak şekilde ya da cstring, oid ve integer türünde üç argüman alacak şekilde bildirilebilir. İlk argüman, bir C dizgesi olarak girdi metnidir. İkinci argüman, tür bir dizi ise dizi elemanlarının nesne kimliği, bir bileşik tür ise türün kendi nesne kimliğidir. Üçüncüsü ise, biliniyorsa, hedef sütunun typmod'u, bilinmiyorsa -1'dir. Girdi işlevi yeni veri türünde bir değer ile dönmelidir. Çıktı işlevi ya yeni veri türünde tek bir argüman alacak şekilde ya da ikincisi oid türünde iki argüman alacak şekilde bildirilebilir. İkinci argüman yine, tür bir dizi ise dizi elemanlarının nesne kimliği, bir bileşik tür ise türün kendi nesne kimliğidir. Çıktı işlevi cstring türünde bir değer ile dönmelidir.
İsteğe bağlı olan alış_işlevi türün harici ikilik gösterimini dahili gösterime çevirir. Eğer bu işlev yoksa, tür ikilik çıktıda rol alamaz. İkilik gösterim oldukça taşınabilir olmanın yanı sıra dahil gösterime dönüşümde ucuz olmalıdır. (Örneğin, standart tamsayı veri türlerinin harici ikilik gösterimleri ağ bayt sıralamasındayken, dahili gösterimleri makinenin doğal bayt sıralamasındadır.) Alış işlevi değerin geçerliliğinden emin olmayı sağlayacak kadar sınama yapmalıdır. Alış işlevi ya internal türünde tek bir argüman alacak şekilde ya da internal ve oid türünde iki argüman alacak şekilde bildirilebilir. İşlev yeni veri türünde bir değer ile dönmelidir. İlk argüman alınan bayt dizgesini tutacak bir StringInfo tamponuna bir göstericidir. İkinci argüman, tür bir dizi ise dizi elemanlarının nesne kimliği, bir bileşik tür ise türün kendi nesne kimliğidir. Benzer şekilde, isteğe bağlı olan gönderim_işlevi türün dahili gösterimini harici ikilik gösterime çevirir. Gönderim işlevi ya yeni veri türünde tek bir argüman alacak şekilde ya da ikincisi oid türünde iki argüman alacak şekilde bildirilebilir. İkinci argüman yine, tür bir dizi ise dizi elemanlarının nesne kimliği, bir bileşik tür ise türün kendi nesne kimliğidir. Gönderim işlevi bytea türünde bir değer ile dönmelidir.
Girdi ve çıktı işlevlerinin yeni tür oluşturulmadan önce yeni türde argümanlar ve veri türleri ile bildirimlerinin nasıl yapılacağı noktasında dikkatli olmalısınız. Bunun yanıtı, önce girdi işlevinin sonra da çıktı işlevinin (ve isteniyorsa, ikilik G/Ç işlevlerinin) oluşturulması, son olarak veri türünün tanımlanması olacaktır. PostgreSQL yeni veri türünün ismini ilk defa girdi işlevinin dönüş türü olarak görecek, sistem kataloğunda basitçe yer tutucu girdi olarak bir kabuk türü ayıracak ve girdi işlevinin tanımını kabuk türüne ilintileyecektir. Benzer şekilde diğer işlevleri de (artık mevcut olan) kabuk türüne ilintileyecektir. Son olarak, CREATE TYPE, kabuk girdisi ile tam tür tanımını yer değiştirir ve yeni tür kullanılabilir olur.
İsteğe bağlı olan analiz_işlevi, veri türündeki sütunlar için türe özgü istatistikleri hesaplar. Öntanımlı olarak, ANALYZE eğer tür için öntanımlı bir b-tree işleç sınıfı varsa, türün eşittir ve küçüktür işleçlerini kullanarak istatistikleri toplamaya çalışacaktır. Bileşik türlerde bu davranış elverişsiz olabilir, bu sorun özel bir analiz işlevi belirterek aşılabilir. Analiz işlevi internal türünde tek bir argüman alacak şekilde bildirilmeli ve boolean türünde bir sonuçla dönmelidir. Analiz işlevlerinin ayrıntılı uygulama arayüzü src/include/commands/vacuum.h dosyasında görülebilir.
Yeni türün dahili gösteriminin ayrıntıları sadece G/Ç işlevleri ve bu türle çalışmak üzere sizin tanımladığınız işlevlerce bilinir; dahili gösteriminin bazı özelliklerinin PostgreSQL'e ayrıca bildirilmesi gerekir. Bunların en önemlisi dahili_uzunluk'tur. Temel veri türleri, dahili_uzunluk bir pozitif tamsayı olarak verildiğinde sabit uzunlukta olabileceği gibi, dahili_uzunluk olarak VARIABLE belirtildiğinde değişken uzuklukta da olabilir (bu dahili olarak typlen'e -1 atanarak yapılır). Değişken uzunluklu tüm veri türleri, türün değerinin toplam uzunluğunu gösteren 4 baytlık bir tamsayı ile başlamalıdır.
İsteğe bağlı olan PASSEDBYVALUE seçeneği bu veri türünün gösterilerek değil değeri ile aktarılacağını belirtir. Dahili gösterimleri Datum türünün genişliğinden (çoğu makinede 4, birkaçında 8 bayttır) daha büyük veri türlerini değeri ile aktaramazsınız.
hizalama parametresi ile belleğin ne uzunlukta adımlanarak veri türünün yerletirileceği belirtilir. İzin verilen adım uzunlukları 1, 2, 4 veya 8 bayttır. Değişken uzunluklu veri türleri için, ilk eleman bir int4 olduğundan en az 4 baytlık adım uzunluğu belirtilmelidir.
strateji parametresi ile değişken uzunluklu veri türlerinin saklama stratejilerinin seçimi mümkün olur. (Sabit uzunluklu türlerde sadece plain mümkündür.) plain ile değerin daima olduğu gibi sıkıştırılmadan saklanacağı; extended ile, değer çok uzunsa önce sıkıştırılmaya çalışılacağı, yine de uzunsa, ana tablo dışına taşınacağı; external ile, değerin ana tablo dışına taşınacağı, fakat sistemin değeri sıkıştırmaya çalışmayacağı; main ile, sıkıştırma yapılacağı ama değerin ana tablo dışına taşınmasının engelleneceği belirtilir. main saklama stratejisinde, değeri tablo satırı içinde saklamanın bir yolu yoksa, değer yine de ana tablo dışına taşınabilir, fakat değerin ana tabloda tutulması bakımından böyle bir öğe extended ve external öğelere göre daha ayrıcalıklıdır.
Kullanıcının sütunlarda NULL değer istememesi durumunda DEFAULT seçeneği ile bir öntanımlı değer belirtilebilir. (Böyle bir öntanımlı değer bir sütuna açıkça iliştirilen bir DEFAULT ile o sütun için değiştirilebilir.)
Türün bir dizi olduğu, dizi elemanları ELEMENT seçeneği kullanılarak belirtilebilir. Örneğin, 4 baytlık tamsayılardan (int4) oluşan bir dizi tanımlamak için, seçenek ELEMENT = int4 şeklinde belirtilir. Dizi türler aşağıda ayrıntılı olarak açıklanmıştır.
Bu türün dizisinin harici gösteriminde kullanmak üzere ayraç olarak belli bir karakter belirtilebilir. Öntanımlı ayraç virgüldür. Yalnız, burada belirtilen ayraç dizi türle değil, dizi elemanının türüyle ilgilidir.