CREATE TABLE(7) | SQL - Dil Deyimleri | CREATE TABLE(7) |
CREATE TABLE - yeni bir tablo tanımlar
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 ]
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.
İ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.
Ö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 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.
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.
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.
Bu deyim, sadece standartdışı SQL veritabanlarıyla uyumluluk için vardır. Yeni uygulamalarda kullanımından vazgeçilmelidir.
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.)
İ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 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.
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:
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.
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.
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.
Başvuran sütunların boş olmasını sağlar.
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.
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.
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.
Geçici tabloların hareket kümesinin sonundaki davranışı, ON COMMIT kullanılarak denetlenebilir. Üç seçeneği vardır:
Hareketin sonunda özel bir eylem yapılmaz. Bu öntanımlı davranıştır.
Her hareket kümesinin sonunda geçici tablonun satırları silinir. Aslında, her teslimde (commit) özdevinimli bir TRUNCATE [truncate(7)] yapılır.
Geçici tablo o anki hareket kümesinin sonunda silinecektir.
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.
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.
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.
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.)
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;
CREATE TABLE cümlesi SQL-92 ve SQL:1999'un bir alt kümesi ile aşağıda belirtilenler dışında uyumludur.
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.
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ı (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.
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.
PostgreSQL'in OID kavramı standart değildir.
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.
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.
ALTER TABLE [alter_table(7)], DROP TABLE [drop_table(7)], CREATE TABLESPACE [create_tablespace(7)].
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005
PostgreSQL |