ALTER TABLE(7) | SQL - Dil Deyimleri | ALTER TABLE(7) |
ALTER TABLE - bir tablonun tanımını değiştirir
ALTER TABLE [ ONLY ] isim [ * ] eylem [, ... ] ALTER TABLE [ ONLY ] isim [ * ] RENAME [ COLUMN ] sütun TO yeni_sütun ALTER TABLE isim RENAME TO yeni_isim eylem şunlardan biri olabilir: ADD [ COLUMN ] sütun tür [ sütun_kısıtı [ ... ] ] DROP [ COLUMN ] sütun [ RESTRICT | CASCADE ] ALTER [ COLUMN ] sütun TYPE tür [ USING ifade ] ALTER [ COLUMN ] sütun SET DEFAULT ifade ALTER [ COLUMN ] sütun DROP DEFAULT ALTER [ COLUMN ] sütun { SET | DROP } NOT NULL ALTER [ COLUMN ] sütun SET STATISTICS tamsayı ALTER [ COLUMN ] sütun SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD tablo_kısıtı DROP CONSTRAINT kısıt_ismi [ RESTRICT | CASCADE ] CLUSTER ON indeks_ismi SET WITHOUT CLUSTER SET WITHOUT OIDS OWNER TO yeni_aidiyet SET TABLESPACE tabloalanı_ismi
ALTER TABLE mevcut bir tablonun tanımını değiştirir. Çeşitli alt biçimleri vardır:
Kaldırılmış bir oid sütununun tekrar yerine konulmasını sağlayacak bir ALTER TABLE alt biçimi olmadığına dikkat edin.
RENAME dışında tüm eylemler çeşitli değişikliklerin birlikte uygulanması için aynı cümlede kullanılabilir. Örneğin, bazı sütunların isimleri değiştirilirken, bazı sütunların eklenmesi mümkündür. Bu işlem genellikle, tüm değişikliklerin tek bir geçişte yapılması zorunlu dev tablolarda kullanışlıdır.
Çalıştırılması için ayrıcalıklı kullanıcı olmanın gerekli olduğu ALTER TABLE OWNER dışında, ALTER TABLE kullanabilmek için tablonun sahibi olmalısınız.
COLUMN anahtar sözcüğü kuru gürültüdür ve atlanabilir.
Bir sütun ADD COLUMN ile eklendiğinde, tablodaki mevcut satırların tümü sütunun öntanımlı değeriyle ilklendirilir (bir DEFAULT deyimi belirtilmemişse NULL ile).
Bir sütunun boş olmayan bir öntanımlı ile eklenmesi veya mevcut bir sütunun türünün değiştirilmesi tablonun tamamının yeniden yazılmasına sebep olur. Bu çok büyük tablolarda önemli sayılabilecek bir süre alır; ayrıca, geçici olarak büyüklüğünün iki katı kadar bir disk alanı gerektirecektir.
Bir CHECK veya NOT NULL kısıtının eklenmesi mevcut satırların kısıtı yerine getirip getirmediğinin sınanması için tablonun taranmasını gerektirir.
Tek bir ALTER TABLE cümlesinde çok sayıda değişikliğin belirtilebilmesi seçeneğinin sağlanmasının ana sebebi çok sayıda tablonun taranmasını ya da tablonun yeniden yazılmasının gerektiği durumlarda tüm değişikliklerin tek bir geçişte yapılmasınını sağlamaktır.
DROP COLUMN sütunu fiziksel olarak silmez, sadece SQL işlemleri için görünmez yapar. Tablo üzerindeki sonraki veri girme ve güncelleme işlemleri sütunda boş değer saklanmasına sebep olur. Bu, bir sütunun kaldırılmasını hızlandırsa da tablonun diskte kapladığı alan, kaldırılan sütunun kapladığı alan geri alınmadığından hemen düşmeyecektir. Mevcut satırlar güncellendikçe bu alan geri kazanılacaktır ama bu çok uzun zaman alabilir.
Aslında ALTER TABLE cümlesinin bir tablonun tümünün yeniden yazılmasını gerektirdiği durumda bir getirisi de vardır, yeniden yazma işlemi tablodaki ölü alanların elenmesini sağlar. Örneğin, kaldırılan bir sütun nedeniyle tabloda tutulan alanı hemen geri kazanmak için en hızlı yol,
ALTER TABLE tablo ALTER COLUMN birsütun TYPE birtür;
yazmaktır. Burada birsütun ile mevcut bir sütunu, birtür ile ise o sütunun kendi türünü belirtiyoruz. Aslında tabloda bir değişiklik yapılmıyor ama bu cümle tablonun yeniden yazılmasını sağlıyor, böylece faydasız veri temizlenmiş oluyor.
ALTER TYPE alt cümlesinin USING seçeneği aslında satırın eski değerleriyle ilişkili bir ifadeyi belirtebilir; yani, bit yandan diğer sütunlara başvururken birini dönüştürüyor olabilir. Bu, ALTER TYPE sözdizimi ile çok genel dönüşümler yapılmasını mümkün kılar. Bu esneklikten dolayı, USING ifadesi sütunun öntanımlı değerine (varsa) uygulanmaz; sonuç bir öntanımlı için gerekli olan bir sabit ifade olmayabilir. Bu, eski türden yeni türe örtük ya da atamalı tür dönüşümünün bulunmadığında, USING seçeneği kullanıldığında bile ALTER TYPE alt cümlesinin dönüşümde başarısız olacağı anlamına gelir. Böyle durumlarda, öntanımlı DROP DEFAULT ile kaldırılarak ALTER TYPE uygulanır ve bunun ardından SET DEFAULT kullanılarak uygun yeni öntanımlı değer eklenir. Sütünla ilgili indekslere ve kısıtlara da benzer şeyler uygulanır.
Eğer bir tablonun bir çocuk tablosu varsa, çocuk tablolarda aynı değişklikler yapılmaksızın bu tablonun bir sütununun türünün ya da isminin değiştirilmesine ve bir sütun eklenmesine izin verilmez. Yani, ALTER TABLE ONLY reddedilir. Bu, bir tablonun çocuklarının daima ana tablonun sütunlarını içermesini sağlamak içindir.
Hem ana tabloya hem de çocuk tablolara uygulanan bir DROP COLUMN işlemi ile sadece, çocuk tablonun ilgili sütunu aynı zamanda başka bir tablodan miras alınmamışsa ve sütun bağımsız olarak tanımlanmamışsa kaldırılacaktır. Sadece ana tabloya uygulanan DROP COLUMN işlemi (ALTER TABLE ONLY ... DROP COLUMN gibi), çocuk tablolardan bu sütunları asla kaldırmayacak, onları miras alınmış değil, bağımsız sütunlar olarak imleyecektir.
Sistem katalog tablosunda herhangi bir değişikliğe izin verilmez.
Geçerli parametrelerin açıklamaları
için CREATE TABLE [create_table(7)] kılavuz
sayfasına bakınız. Kalıtım ile ilgili
bilgileri ise
http://www.postgresql.org/docs/8.0/static/ddl.html
bölümünde bulabilirsiniz.
Bir tabloya varchar türünde bir sütun eklemek için:
ALTER TABLE distributors ADD COLUMN address varchar(30);
Bir tablodan bir sütunu kaldırmak için:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
Mevcut iki sütunun türünü tek bir işlemle değiştirmek için:
ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100);
UNIX zaman değerini içeren bir sütunun türünü USING seçeneğini kullanarak timestamp with time zone (zaman dilimli zaman gösterimi) türüne dönüştürmek için:
ALTER TABLE foo ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
Mevcut bir sütunun ismini değiştirmek için:
ALTER TABLE distributors RENAME COLUMN address TO city;
Mevcut bir tablonun ismini değiştirmek için:
ALTER TABLE distributors RENAME TO suppliers;
Bir sütuna boş değer içermeme kısıtı eklemek için:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
Bir sütundan boş değer içermeme kısıtını kaldırmak için:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
Bir tabloya bir sınama kısıtı eklemek için:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Bir tablodan ve çocuklarından bir sınama kısıtını kaldırmak için:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
Bir tabloya bir anahtar kısıtı eklemek için:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;
Bir tabloya (çoksütunlu) bir eşsizlik kısıtı eklemek için:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
Bir tabloya bir birincil anahtarı olmasa bile, özdevimli isimlenen bir birincil anahtar kısıtı eklemek için:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
Bir tabloyu başka bir tablo alanına taşımak için:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
ADD, DROP ve SET DEFAULT alt biçimleri SQL standardıyla uyumludur. Diğer alt biçimler birer PostgreSQL oluşumudur. Ayrıca, tek bir ALTER TABLE cümlesinde birden fazla değişikliğin belirtilebilmesi özelliği de bir PostgreSQL oluşumudur.
ALTER TABLE DROP COLUMN ile geriye bir sıfır sütunlu tablo kalmak üzere bir tablonun tek sütunu kaldırılabilir. SQL standardı sıfır sütunluk tablolara izin vermediğinden bu da bir PostgreSQL oluşumudur.
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Mart 2005
PostgreSQL |