CREATE TABLE(7)

İSİM
CREATE TABLE - yeni bir tablo tanımlar

KULLANIM
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE tablo_ismi (
  { sütun_ismi veri_türü [ DEFAULT öntanımlı_ifade ]
    [ sütun_kısıtı [ ... ] ]
    | tablo_kısıtı
    | LIKE ana_tablo [ { INCLUDING | EXCLUDING } DEFAULTS ] }  [, ... ]
)
[ INHERITS ( ana_tablo [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tabloalanı ]

Buradaki sütun_kısıtı:

[ CONSTRAINT kısıt_ismi ]
{ NOT NULL |
  NULL |
  UNIQUE [ USING INDEX TABLESPACE tabloalanı ]
  | PRIMARY KEY [ USING INDEX TABLESPACE tabloalanı ]
  | CHECK (ifade)
  | REFERENCES başvuru_tablosu [ ( başvuru_sütunu ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE eylem ] [ ON UPDATE eylem ] }
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

ve tablo_kısıtı:

[ CONSTRAINT kısıt_ismi ]
{ UNIQUE ( sütun_ismi [, ... ] )
   [ USING INDEX TABLESPACE tabloalanı ]
   | PRIMARY KEY ( sütun_ismi [, ... ] )
      [ USING INDEX TABLESPACE tabloalanı ]
      | CHECK ( ifade )
      | FOREIGN KEY ( sütun_ismi [, ... ] )
         REFERENCES başvuru_tablosu [ ( başvuru_sütunu [, ... ] ) ]
         [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
         [ ON DELETE eylem ] [ ON UPDATE eylem ] }
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

AÇIKLAMA
CREATE TABLE o anki veritabanınında yeni bir tabloyu ilk olarak boş bir tablo olarak oluşturacaktır. Tablonun sahibi komutu çalıştıran kullanıcı olacaktır.

Eğer bir şema ismi belirtilmişse (CREATE TABLE myschema.mytable ... gibi), tablo belirtilen şemada oluşturulur. Aksi takdirde o an geçerli olan şemada oluşturulur. Geçici tablolar bir özel şema içinde mevcuttur, dolayısıyla bir geçici tablo oluştururken bir şema ismi belirtilmeyebilir. Tablo ismi şema içindeki diğer tabloların, indekslerin ve sanal tabloların isimlerinden farklı olmalıdır.

CREATE TABLE ayrıca, özdevinimli olarak tablonun bir satırına karşılık olarak karma bir veri türü oluşturur. Bu nedenle, aynı şema içindeki tablolar mevcut veri türleriyle aynı isme sahip olamazlar.

İsteğe bağlı kısıt deyimleri ile yeni veya güncellenen satırların yerleştirme ve güncelleme işlemlerinin sağlaması gereken kısıtlar (sınamalar) belirtilir. Bir kısıt, tablo içinde çeşitli yollarla geçerli değerlerin tanımlanmasına yardımcı olacak bir SQL nesnesidir.

Kısıtları tanımlamanın iki yolu vardır: tablo kısıtları ve sütun kısıtları. Bir sütun kısıtı bir sütun tanımının parçası olarak tanımlanır ve birden fazla sütunu kuşatabilir. Her sütun kısıtı ayrıca, bir tablo kısıtı olarak da yazılabilir; bir kısıt sadece bir sütunu etkilediğinde bir sütun kısıtı sayılabilir.

PARAMETRELER
TEMPORARY veya TEMP
    Belirtilmişse tablo bir geçici tablo olarak oluşturulur. Geçici tablolar bir oturumun sonunda özdevinimli olarak silinir, bazan isteğe bağlı olarak bir hareketin sonunda da silinebilir (aşağıdaki ON COMMIT açıklamasına bakınız). şema nitelemeli ismlerle başvurulmadıkça, aynı isimle varolan kalıcı tablolar geçici tablonun varlığı durumunda o anki oturuma görünür olmazlar. Bir geçici tablo üzerinde oluşturulan indeksler de özdevinimli olarak geçici olacaktır.

    İsteğe bağlı olarak, TEMPORARY veya TEMP'den önce GLOBAL veya LOCAL yazılabilir. Bu, PostgreSQL'de bir şey farkettirmez, ama yine de Uyumluluk bölümüne bakın.

tablo_ismi
    Oluşturulacak tablonun ismi (şema nitelemeli olabilir).

sütun_ismi
    Yeni tabloda oluşturulacak bir sütunun ismi.

veri_türü
    Sütunun veri türü. Bu, dizi belirteçleri içerebilir. PostgreSQL tarafından desteklenen veri türleri hakkında bilgi edinmek için http://www.postgresql.org/docs/8.0/static/datatype.html adresine bakınız.

DEFAULT öntanımlı_ifade
    DEFAULT deyimi sütun tanımının içinde görünerek sütun için bir öntanımlı veri değeri atar. Değer, bir değişken içrmeyen bir ifadedir (tablo içinde diğer sütunlara çağraz başvurulara ve altsorgulara izin verilmez). Öntanımlı ifadenin veri türü sütunun veri türü ile eşleşmelidir.

    Önanımlı ifade, sütun için bir değer belirtmeyen bir veri girme işleminde sütun değeri olarak kullanılacaktır. Bir sütun için öntanımlı bir değer belirtilmezse, NULL öntanımlıdır.

INHERITS ( ana_tablo [, ... ] )
    İsteğe bağlı INHERITS deyimi, yeni bir tablonun tüm sütunlarını miras alacağı tabloların bir listesini belirtmek için kullanılır.

    INHERITS kullanımı yeni çocuk tablo ile onun abeveyni olan tablo arasında kalıcı bir birliktelik oluşturur. Ebeveynler üzerindeki şema değişiklikleri normalde çocukları da etkiler ve öntanımlı olarak çocuk tablonun verisi ebeveynler tarafından paylaşılır.

    Eğer aynı sütun ismi birden fazla ebeveyn tabloda mevcutsa ve bu tabloların bu sütunları veri türü bakımından eşleşmediği takdirde bir hata raporlanacaktır. Eğer böyle bir durum yoksa, yinelenen sütunlar yani tabloda tek bir sütun oluşturacak şekilde katıştırılırlar. Eğer yeni tablonun sütun isimleri listesi aynı zamanda miras alınmış bir sütun da içeriyorsa, veri türü miras alınan sütunlara benzer şekilde eşleşmeli ve sütun tanımları tek bir sütun olarak katıştırılmalıdır. Ancak, miras alınan ve yeni sütun bildirimlerinin eşdeğer kısıtla belirtmesi gerekmez: bildirimlerden toplanan tüm kısıtlar birlikte katıştırılır ve tümü yeni tabloya uygulanır. Eğer yeni tablo sütun için açıkça bir öntanımlı değer belirtiyorsa, bu öntanımlı değer, miras alınan sütun bildirimlerin gelen öntanımlıların yerine geçer. Aksi takdirde, sütun için öntanımlı değer belirten her ebeveyn aynı öntanımlı değeri belirtmelidir, yoksa bir hata raporlanacaktır.

LIKE ana_tablo [ { INCLUDING | EXCLUDING } DEFAULTS ]
    LIKE deyimi, yeni bir tabloya veri türleri ve boş olmayan kısıtları ile birlikte tüm sütun isimlerinin özdevinimli kopyalanacağı bir tablo belirtir.

    INHERITS'in tersine, yeni tablo ve özgün tablo oluşturma işleminden sonra tamamen birbirlerinin kopyası olurlar. Özgün tabloda yapılacak değişiklikler yeni tabloya uygulanmayacak ve yeni tabloda özgün tablodan alınmış veri olmayacaktır.

    Kopyalanan sütun tanımları için öntanımlı olan ifadeler sadece INCLUDING DEFAULTS belirtilmişse kopyalanacaktır. Öntanımlı davranış öntanımlı olan ifadelerin dışlanması ve sonuç olarak yeni tablonun tüm sütunlarının boş öntanımlılara sahip olmasıdır.

WITH OIDS, WITHOUT OIDS
    Bu isteğe bağlı deyimler, yeni tablonun satırlarının onlara atanacak OID'lere (nesne belirteçlerine) sahip olup olmayacağını belirtmekte kullanılır. Eğer ne WITH OIDS ne de WITHOUT OIDS belirtilmişse, öntanımlı değer default_with_oids yapılandırma parametresinin değerine bağlıdır. (Eğer yeni tablo nesne belirteçlerine sahip bir tabloyu miras alıyorsa, tabloyu oluşturan cümle WITHOUT OIDS içerse bile WITH OIDS geçerli olur.)

    Eğer WITHOUT OIDS belirtilmiş ve uygulanmışsa, yeni tablo nesne belirteçlerini saklamaz ve girilen her yeni satır için bir nesne belirteci atanmaz. Nesne belirteci tüketimi azalacağından ve bu suretle 32 bitlik OID sayacının başa dönmesi erteleneceğinden genelde edilen zahmete değer. Sayaç bir kere başa döndü mü, nesne belirteçlerinin artık eşsiz olmayacağı varsayılır ve bu onları nispeten daha az yararlı hale getirir. Nesne belirteçlerinin dışlanması ek olarak, her satır için 4 bayt (çoğu makinede) olmak üzere tablonun disk üzerinde kaplayacağı alanı düşürecek ve başarımı oldukça arttıracaktır.

    Tablo oluşturulduktan sonra nesne belirteçlerini kaldırmak için ALTER TABLE [alter_table(7)] kullanın.

CONSTRAINT kısıt_ismi
    Bir sütun ya da tablo kısıtı için isteğe bağlı bir isim. Belirtilmezse ismi sistem üretir.

NOT NULL
    Sütunun boş değer içeremeyeceğini belirtir.

NULL
    Sütunun boş değer içermesine izin verilir. bu öntanımlıdır.

    Bu deyim, sadece standartdışı SQL veritabanlarıyla uyumluluk için vardır. Yeni uygulamalarda kullanımından vazgeçilmelidir.

UNIQUE kısıtı, bir tablonun bir veya daha fazla sütunundan oluşan bir grubunun sadece eşsiz değerler içerebileceğini belirtir. Eşsiz tablo kısıtının davranışı, çok sayıda sütun belirtilebilmesi dışında sütun kısıtınınki ile aynıdır.

    Eşsizlik kısıtının amacına uygun olarak, boş değerlerin eşit olmadıkları varsayılır.

    Her eşsiz tablo kısıtı, aynı tabloda tanımlanmış diğer eşsizlik veya birincil anahtar kısıtı tarafından isimlendirilmiş sütun grubundan farklı bir sütun grubunu isimlendirmelidir. (Aksi takdirde, yalnızca, aynı kısıt iki kere listelenmiş olur.)

Birincil anahtar kısıtı bir tablonun bir sütununun ya da sütunlarının sadece elsiz ve boş olmayan değerler içerebileceğini belirtir. Teknik olarak, PRIMARY KEY sadece UNIQUE ile NOT NULL deyiminin birleşimidir, fakat bir sütun grubunun birincil anahtar olarak belirtilmesi ayrıca, şema tasarımı hakkında hamveri sağlar; bir birincil anahtar uygulanmış gibi diğer tablolar, bu tablonun satırları için bir eşsiz belirteç olarak bu sütun grubuna bel bağlayayabilir.

    İster sütun ister tablo kısıtı olarak belirtilsin, bir tablo için sadece bir birincil anahtar belirtilebilir.

    Birincil anahtar kısıtı, aynı tabloda tanımlanmış bir eşsizlik kısıtı tarafından isimlendirilmiş diğer sütun gruplarından farklı bir sütun grubunu isimlendirmelidir.

CHECK (ifade)
    CHECK deyimi, bir veri girme veya güncelleme işlemi sonucunda yeni ya da güncellenmiş satırların sağlaması gereken bir mantıksal sonuç üreten bir ifadeyi belirtmek için kullanılır. TRUE veya UNKNOWN olarak sonuçlanan ifadeler başarılı kabul edilir. Bir veri girme veya güncelleme işleminin ürettiği bir FALSE sonucunda bir hata olağandışılığı oluşur ve bu veri girme veya güncelleme işlemi veritabanını değiştirmez. Bir tablo kısıtı içinde görünen bir ifade çok sayıda sütunun değeri ile ilgili olabilirken, bir sütun kısıtı olarak belirtilen bir sınama kısıtı sadece bu sütunun değeriyle ilgili olmalıdır.

    Şimdilik, CHECK ifadeleri ne altsorgu içerebilir ne de üzerinde çalışılan satır dışındaki sütunların değerleriyle ilgili olabilir.

Bu deyimler, başvurulan tablonun bir satırının başvurulan sütunlarındaki değerlerle eşleşmesi gereken değerler içermesi istenen yeni tablonun bir ya da daha fazla sütunundan oluşan bir sütun grubunu gerektiren bir yabancı anahtar kısıtı belirtir. Eğer başvuru_sütunu belirtilmezse, başvuru_tablosu'nun birincil anahtarı kullanılır. Başvurulan sütunlar, başvurulan tablodaki bir eşsizlik veya bir birincil anahtar kısıtınının sütunları olmalıdır.

    Bşvurulan sütunlara girilen bir değer, başvurulan tablonun ve başvurulan sütunların değerleriyle belirtilen eşleşme türü kullanılarak eşleşmelidir. Üç eşleşme türü vardır: MATCH FULL, MATCH PARTIAL ve aynı zamanda öntanımlı olan MATCH SIMPLE. MATCH FULL, tüm yabancı anahtar sütunları boş olmadıkça, bir çok sütunlu yabancı anahtarın tek sütununun boş olmasına izin vermeyecektir. MATCH SIMPLE, diğer yabancı anahtar sütunları boş değer içermezken, bazı yabancı anahtar sütunlarının boş değer içermesine izin verecektir. MATCH PARTIAL ise henüz gerçeklenmemiştir.

    Ek olarak, başvurulan sütunlardaki veri değiştiğinde, bu tablonun sütunlarının verisi üzerinde bazı eylemler uygulanır. ON DELETE deyimi, başvurulan tablodaki başvurulan satır silindiğinde uygulanacak eylemi belirtmekte kullanılır. Benzer şekilde, ON UPDATE deyimi, başvurulan tablodaki başvurulan sütun yeni bir değerle güncellendiğinde uygulanacak eylemi belirtmekte kullanılır. Eğer başvurulan satır güncellenmeksizin bu sütunu içeren satır güncellenmişse, bir işlem yapılmaz. NO ACTION sınaması dışında hiçbir göreli eylem, kısıtta ertelenebileceği belirtilmiş olsa bile ertelenemez. Her deyim için olası eylemler şunlardır:

    NO ACTION
        Silme veya güncelleme işlemini bir yabancı anahtar kısıtı çelişkisi ürettiğinde bunu belirten bir hatanın üretilmesini sağlar. Eğer kısıt ertelenmişse ve başvurulan satırlar hala mevcutsa, bu hata kısıtın sınanması sırasında üretilecektir. Bu öntanımlı eylemdir.

    RESTRICT
        Silme veya güncelleme işlemini bir yabancı anahtar kısıtı çelişkisi ürettiğinde bunu belirten bir hatanın üretilmesini sağlar. Sınamanın ertelenebilir olmaması dışında NO ACTION'a benzer.

    CASCADE
        Silinen satıra başvuran bir satırın silinmesini ya da başvuran sütunun değerinin başvurulan sütunun yeni değerine güncellenmesini sağlar.

    SET NULL
        Başvuran sütunların boş olmasını sağlar.

    SET DEFAULT
        Başvuran sütunlara öntanımlı değerlerinin atanmasını sağlar.

    Eğer başvurulan sütunlar sıkça değişmiyorsa, yabancı anahtar sütununa bir indeks eklemek akıllıca olur, böylece yabancı anahtar sütunu ile ilgili göreli eylemler daha verimli uygulanabilir.

DEFERRABLE, NOT DEFERRABLE
    Kısıtın ertelenip ertelenmeyeceğini belirler. Ertelenebilir olmayan (not deferrable) bir kısıt her deyimden sonra anında sınanacaktır. Ertelenebilir bir kısıt ise, SET CONSTRAINTS [set-constraints(7)] deyimi kullanılarak hareketin sonuna kadar ertelenebilir. NOT DEFERRABLE öntanımlıdır. Şimdilik sadece yabancı anahtar kısıtları bu deyimleri kabul etmektedir. Diğer tüm kısıt türleri ertelenebilir değildir.

INITIALLY IMMEDIATE, INITIALLY DEFERRED
    Eğer bir kısıt ertelenebilirse, bu deyim kısıtın öntanımlı sınama zamanını belirtmek için kullanılabilir. Eğer kısıt INITIALLY IMMEDIATE ise, her deyimden sonra sınanacaktır. Eğer kısıt INITIALLY DEFERRED ise, sadece hareketin sonunda sınanır. Kısıtın sınama zamanı SET CONSTRAINTS [set_constraints(7)] cümlesi ile değiştirilebilir.

ON COMMIT
    Geçici tabloların hareket kümesinin sonundaki davranışı, ON COMMIT kullanılarak denetlenebilir. Üç seçeneği vardır:

    PRESERVE ROWS
        Hareketin sonunda özel bir eylem yapılmaz. Bu öntanımlı davranıştır.

    DELETE ROWS
        Her hareket kümesinin sonunda geçici tablonun satırları silinir. Aslında, her teslimde (commit) özdevinimli bir TRUNCATE [truncate(7)] yapılır.

    DROP
        Geçici tablo o anki hareket kümesinin sonunda silinecektir.

TABLESPACE tabloalanı
    tabloalanı, yeni tablonun içinde oluşturulacağı tablo alanının ismidir. Belirtilmezse, default_tablespace yapılandırma parametresinin değeri, bu parametrenin değeri boş dizge ise veritabanının öntanımlı tablo alanı kullanılır.

USING INDEX TABLESPACE tabloalanı
    Bir UNIQUE veya PRIMARY KEY kısıtı ile ilişkili olarak oluşturulacak indeksdeki tablo alanının seçimini mümkün kılar. Belirtilmezse, default_tablespace yapılandırma parametresinin değeri, bu parametrenin değeri boş dizge ise veritabanının öntanımlı tablo alanı kullanılır.

EK BİLGİ
Nesne belirteçlerinin (OID) yeni uygulamalarda kullanılması önerilmez: mümkünse, bir SERIAL veya başka bir kayıt listesi üretecinin, tablonun birincil anahtarı olarak kullanılması önerilir. Yine de uygulamanız, bir tablonun belli bir satırını belirtmek için nesne belirteçlerini kullanıyorsa, tablodaki nesne belirteçlerinin sayaç başa döndükten spnra bile satırları eşsiz olarak belirttiğinden emin olmak için tablonun oid sütununda bir eşsizlik kısıtı oluşturmanızı öneririz. Bu nesne belirteçlerinin veritabanı çapında eşsiz olduğunu kabulden kaçının; eğer veritabanı çapında eşsiz bir belirtece ihtiyacınız varsa, tableoid ile tablonun oid sütununu birlikte kullanın.

İpucu:
    Birincil anahtarı olmayan tablolar için, hem bir OID hem de bir eşsiz veri anahtarı olmaksızın, satırları belirtmek zor olacağından, WITHOUT OIDS kullanımı önerilmez.

PostgreSQL eşsizliği güçlendirmek için her eşsizlik kısıtı ve her birincil anahtar kısıtı için bir indeksi özdevinimli olarak oluşturur. Bu suretle, birincil anahtar ütunu için açıkça bir indeks oluşturmak gerekmez. (Daha fazla bilgi için CREATE INDEX [create_index(7)] kılavuz sayfasına bakınız.)

Eşsizlik kısıtları ve birincil anahtarlar, şimdiki gerçeklenimde miras alınmamaktadır. Bu, eşsizlik kısıtları ile miras almanın birleşimini tersine işlevsiz yapar.

Bir tablo 1600 sütundan fazla sütun içeremez. (Uygulamada, demet uzunluğu kısıtlarından dolayı etkin sınır daha düşüktür.)

ÖRNEKLER
films ve distributors tablolarını oluşturmak için:

    CREATE TABLE films (
        code        char(5) CONSTRAINT firstkey PRIMARY KEY,
        title       varchar(40) NOT NULL,
        did         integer NOT NULL,
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute
    );

    CREATE TABLE distributors (
        did    integer PRIMARY KEY DEFAULT nextval('serial'),
        name   varchar(40) NOT NULL CHECK (name <> '')
    );

2 boyutlu bir dizi ile bir tablo oluşturmak için:

CREATE TABLE array_int (
    vector  int[][]
);

films tablosu için bir eşsiz tablo kısıtının tanımlanması. Eşsiz tablo kısıtları tablonun bir veya daha fazla sütunu için tanımlanabilir:

    CREATE TABLE films (
        code        char(5),
        title       varchar(40),
        did         integer,
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute,
        CONSTRAINT production UNIQUE(date_prod)
    );

Bir sınama sütunu kısıtı tanımlamak için:

    CREATE TABLE distributors (
        did     integer CHECK (did > 100),
        name    varchar(40)
    );

Bir sınama tablo kısıtı tanımlamak için:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40)
        CONSTRAINT con1 CHECK (did > 100 AND name <> '')
    );

films tablosu için bir birincil anahtar tablo kısıtının tanımlanması. Birincil anahtar tablo kısıtları tablonun bir ya da daha fazla sütununda tanımlanabilir:

    CREATE TABLE films (
        code        char(5),
        title       varchar(40),
        did         integer,
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute,
        CONSTRAINT code_title PRIMARY KEY(code,title)
    );

distributors tablosu için bir birincil anahtar kısıtının tanımlanması. Aşağıdaki iki örnek eşdeğerdir, ilki tablo kısıtı sözdizimini, ikincisi sütun kısıtı sözdizimini kullanır:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40),
        PRIMARY KEY(did)
    );

    CREATE TABLE distributors (
        did     integer PRIMARY KEY,
        name    varchar(40)
    );

Aşağıdaki örnekte, name sütunu için öntanımlı değer olarak bir dizge sabiti atanmakta; did sütununun öntanımlı değeri bir kayıt listesinin sonraki değeri seçilerek üretilmekte; modtime sütununun öntanımlı değeri ise satıra verinin girildiği zaman olmaktadır.

    CREATE TABLE distributors (
        name      varchar(40) DEFAULT 'Luso Films',
        did       integer DEFAULT nextval('distributors_serial'),
        modtime   timestamp DEFAULT current_timestamp
    );

distributors tablosunda açıkça bir isim belirterek iki NOT NULL sütun kısıtının tanımlanması:

    CREATE TABLE distributors (
        did     integer CONSTRAINT no_null NOT NULL,
        name    varchar(40) NOT NULL
    );

name sütunu için bir eşsizlik kısıtının tanımlanması:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40) UNIQUE
    );

Bu örnek, yukarıdaki örneğe eşdeğerdir:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40),
        UNIQUE(name)
    );

diskvol1 tablo alanında cinemas tablosunun oluşturulması:

    CREATE TABLE cinemas (
            id serial,
            name text,
            location text
    ) TABLESPACE diskvol1;

UYUMLULUK
CREATE TABLE cümlesi SQL-92 ve SQL:1999'un bir alt kümesi ile aşağıda belirtilenler dışında uyumludur.

  Geçici tablolar
CREATE TEMPORARY TABLE sözdizimi bakımından SQL standardına benzese de etkisi aynı değildir. Standartta, geçici tablolar bir defada tanımlanır ve onlara ihtiyaç oldukça he oturumda özdevinimli olarak mevcut olurlar (başlangıçta boş içerikle). PostgreSQL'de ise, bir geçici tablonun her gerekişinde oturumda CREATE TEMPORARY TABLE cümlesinin açıkça çalıştırılması gerekir. Bu, farklı oturumların aynı geçici tabloyu farklı amaçlarla kullanabilmesine olanak sağlar. Halbuki standardın yaklaşımı, belirtilen geçici tablo ismiyle erişilen her kopyanın aynı tablo yapısına sahip olması şeklinde bir sınırlama içerir.

Standardın geçici tabloların davranışıyla ilgili tanımı geniş çapta yoksayılır. Bu noktada, PostgreSQL'in davranışı çeşitli başka SQL veritabanlarınınkine benzerlik gösterir.

Standardın yerel ve genel geçici tabloları ayrımsama yöntemi, PostgreSQL'in sahip olmadığı modül kavramına oturtulduğundan, PostgreSQL aynı yöntemi kullanmaz. Uyumluluk uğruna, PostgreSQL bir geçici tablo bildiriminde GLOBAL ve LOCAL anahtar sözcüklerini kabul eder, ama bunların bir etkisi yoktur.

Geçici tablolar için ON COMMIT deyimi SQL standardıyla benzerlik gösterse de, bazı farklar vardır. Eğer ON COMMIT belirtilmezse, SQL öntanımlı davranış olarak ON COMMIT DELETE ROWS belirtiken, PostgreSQL öntanımlı davranış olarak ON COMMIT PRESERVE ROWS belirtir. ON COMMIT DROP seçeneği ise SQL standardında yoktur.

  Sütun Sınama Kısıtları
SQL standardı, CHECK sütun kısıtlarının sadece uygulandığı sütun ile ilgili olabileceğini söyler; sadece CHECK tablo kısıtları çok sayıda sütun ile ilgili olabilir. PostgreSQL böyle bir sınırlamayı zorunlu kılmaz; sütun ve tablo kısıtlarının farksız olduğunu kabul eder.

  NULL Kısıtı
NULL kısıtı (aslında bir kısıt değildir) (ve simetriği olan NOT NULL kısıtı), bir PostgreSQL oluşumudur ve bazı başka veritabanı sistemleriyle uyumluluk adına vardır. Bir sütun için zaten öntanımlı olduğundan varlığı basitçe kuru gürültüdür.

  Kalıtım
INHERITS deyimi ile çok sayıda miras alınması bir PostgreSQL oluşumudur. SQL:1999 standardı (ama, SQL-92 değil), farklı bir sözdizimi ve farklı sözcüklerle tek bir miras alma deyimi tanımlar. SQL:1999 tarzı kalıtım henüz PostgreSQL tarafından desteklenmemektedir.

  Nesne Kimlikleri
PostgreSQL'in OID kavramı standart değildir.

  Sıfır Sütunluk Tablolar
PostgreSQL bir tablonun hiç sütun içermeksizin oluşturulmasına izin verir (CREATE TABLE foo(); gibi). Bu bir PostgreSQL oluşumudur. SQL standardı sıfır sütunluk tablolara izin vermez. Sıfır sütunluk tablolar kendi başlarına çok kullanışlı olmamakla beraber, buna izin verilmemesi, ALTER TABLE DROP COLUMN için tuhaf özel durumlar oluşmasına yol açar, dolayısıyla standardın bu sınırlamasını yoksaymak daha temiz görünür.

  Tablo Alanları
PostgreSQL'in tablo alanı kavramı standardın bir parçası değildir. Dolayısıyla, TABLESPACE ve USING INDEX TABLESPACE deyimleri birer PostgreSQL oluşumudur.

İLGİLİ BELGELER
ALTER TABLE [alter_table(7)], DROP TABLE [drop_table(7)], CREATE TABLESPACE [create_tablespace(7)].

ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005