İSİM¶
ALTER TABLE - bir tablonun tanımını
değiştirir
KULLANIM¶
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
AÇIKLAMA¶
ALTER TABLE mevcut bir tablonun tanımını
değiştirir. Çeşitli alt biçimleri
vardır:
- ADD COLUMN
- CREATE TABLE [create_table(7)] ile aynı sözdizimini
kullanarak tabloya yeni bir sütun eklemekte
kullanılır.
- DROP COLUMN
- Bir tablodan bir sütunu kaldırmak için
kullanılır. Sütunla ilgili indeksler ve tablo
kısıtları özdevimli olarak
kaldırılır. Anahtar başvuruları ve
sanal tablolar gibi sütuna tablo dışında
bağımlı herşeyin buna dahil
olmasını istiyorsanız, CASCADE'a da
ihtiyacınız var demektir.
- ALTER COLUMN TYPE
- Bir tablo sütununun türünü
değiştirmekte kullanılır. Sütunla
ilgili indeksler ve tablo kısıtları yeni sütun
türünü kullanacak şekilde, özgün
olarak sağlanmış ifadelerle yeniden
çözümlerek özdevimli olarak
değiştirilir. İsteğe bağlı
USING deyimiyle yeni sütun değerlerinin eski
değerlerden nasıl hesaplanacağı belirtilir;
kullanılmadığı takdirde,
öntanımlı dönüşüm, eski
veri türünden yeni veri türüne atama
dönüşümü şeklinde
yapılır. Eski türden yeni türe
dönüşüm için bir örtük
dönüşüm ya da atama
dönüşümü yoksa, bir USING deyimi
kullanılmak zorundadır.
- SET/DROP DEFAULT
- Bir sütunun öntanımlı değerini
belirlemek ya da kaldırmak için kullanılır.
Öntanımlı değerler, sadece sonraki
INSERT cümlelerine uygulanır; tablodaki mevcut
satırları etkilemez. Öntanımlılar,
ayrıca sanal tablolar için de oluşturulmuş
olabilir, bu durumda sadece, sanal tabloya ON INSERT uygulanmadan
önce INSERT deyimiyle yerleştirilir.
- SET/DROP NOT NULL
- Bir sütunun NULL değerlere izin verip vermeyeceğini
belirlemek için kullanılır. Sadece, sütun bir
NULL değer içermediği takdirde, SET NOT NULL
kullanabilirsiniz.
- SET STATISTICS
- Sonraki ANALYZE [analyze(7)] işlemleri için
sütun başına istatistik toplama hedefini belirlemek
için kullanılır. Hedef 0-1000
aralığında ya da sistem
öntanımlı istatistik hedefininin (bir
yapılandırma parametresi olan default_statistics_target'in
değerinin) kullanılması için -1 olarak
belirtilebilir. PostgreSQL sorgu planlamacısı
tarafından istatistiklerin kullanımı hakkında
daha fazla bilgi edinmek için
http://www.postgresql.org/docs/8.0/static/planner-stats.html adresine
bakınız.
- SET STORAGE
- Bir sütunun saklama kipini belirlemek için
kullanılır. Bu, sütunun içerde mi yoksa ek bir
tabloda mı tutulacağını ve verinin
sıkıştılacağını mı
yoksa sıkıştılmayacağını
mı denetler. integer gibi sabit genişlikli değerlerin
için içerde ve
sıkıştırılmış
olması için PLAIN
kullanılmalıdır. İçerde ve
sıkıştırılmış
değerler için MAIN, harici ve
sıkıştırılmamış
değerler için EXTERNAL, harici ve
sıkıştırılmış
değerler için EXTENDED kullanılır.
EXTENDED, PLAIN kipini desteklemeyen çoğu veri
türü için öntanımlıdır.
EXTERNAL kullanımı text ve bytea
türündeki sütunlar için saklama
alanını büyütmesine karşın
altdizge işlemlerinin, daha hızlı
yapılmasını sağlar. SET STORAGE tablo
üzerindeki hiçbir şeyi kendisi
değiştirmez, sadece gelecekteki tablo güncellemeleri
sırasında izlenecek stratejiyi belirler. Daha fazla bilgi
için
http://www.postgresql.org/docs/8.0/static/storage-toast.html adresine
bakınız.
- ADD tablo_kısıtı
- CREATE TABLE [create_table(7)] ile aynı sözdizimini
kullanarak tabloya yeni bir kısıt eklemekte
kullanılır.
- DROP CONSTRAINT
- Bir tablodaki kısıtları kaldırmak için
kullanılır. Şimdilik, tablolardaki
kısıtların eşsiz isimlere sahip olması
gerekmemektedir, dolayısıyla belirtilen isimle
eşleşen birden fazla kısıt olabilir.
Eşleşen tüm kısıtlar
kaldırılacaktır.
- CLUSTER
- Sonraki CLUSTER [cluster(7)] işlemleri için
öntanımlı indeksi seçmekte
kullanılır. Gerçekte tabloyu yeniden
kümelemez.
- SET WITHOUT CLUSTER
- Tabloda en son kullanılan CLUSTER [cluster(7)] indeks
belirtimini kaldırmak için kullanılır. Bu,
gelecekteki bir indeks belirtmeyen tüm kümeleme
işlemlerini etkileyecektir.
- SET WITHOUT OIDS
- Tablodan oid sistem sütununu kaldırmak için
kullanılır. Zaten bir oid sütununun
bulunmadığından şikayet etmesi
dışında, DROP COLUMN oid RESTRICT deyimine
tamamen eşdeğerdir.
Kaldırılmış bir oid sütununun tekrar
yerine konulmasını sağlayacak bir ALTER TABLE
alt biçimi olmadığına dikkat edin.
- OWNER
- Tablonun, kayıt listesinin veya sanal tablonun sahibini belirtilen
kullanıcı yapar.
- SET TABLESPACE
- Tablonun tablo alanını değiştirmek için
kullanılır. Tablo ile ilişkili tüm veri
dosyalarının yani tablo alanına
taşınmasını sağlar. İndeksler
eğer varsa yani alana taşınmaz;
taşınması isteniyorsa, ayrı bir cümle
olarak bir SET TABLESPACE cümlesi ile yapılabilir.
Ayrıca CREATE TABLESPACE [create_tablespace(7)]
kılavuz sayfasına de bakınız.
- RENAME
- Bir tablo (veya indeks, kayıt listesi ya da sanal tablo) ismini ya
da bir tablonun tek bir sütununun ismini
değiştirmekte kullanılır.
Saklanmış veriler etkilenmez.
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.
PARAMETRELER¶
- isim
- Değiştirilecek tablonun ismi (şema nitelemeli
olabilir). Eğer ONLY belirtilmişse sadece bu tablo
değiştirilir, belirtilmemişse bu tablo ve onun
çocukları olan tablolar (varsa) değiştirilir.
Çocuk tablolarında değiştirileceğini
belirtmek üzere tablo isminin sonuna bir * eklenebilirse de,
bu artık öntanımlıdır. (7.1
sürümünden önce, ONLY
öntanımlı davranıştır.
Öntanımlı davranış sql_inheritance
yapılandırma parametresi ile
değiştirilebilir.)
- sütun
- Yeni ya da mevcut bir sütunun ismi.
- yeni_sütun
- Yeni ya da mevcut bir sütunun yeni ismi.
- yeni_isim
- Tablonun yeni ismi.
- tür
- Mevcut bir sütun için yeni veri türü ya da
yeni bir sütunun veri türü.
- tablo_kısıtı
- Tablo için yeni tablo kısıtı.
- kısıt_ismi
- Kaldırılacak mevcut bir kısıtın ismi.
- CASCADE
- Kaldırılan kısıt veya sütuna
bağımlı nesnelerin (örneğin, bu
sütuna başvuran sanal tabloların) özdevimli
olarak kaldırılmasını sağlar.
- RESTRICT
- Bağımlı nesneleri olan kısıt veya
sütunun kaldırılmasını engeller. Bu
davranış öntanımlıdır.
- indeks_ismi
- Tablonun kümeleme için imleyeceği indeks ismi.
- yeni_aidiyet
- Tablonun yeni sahibinin kullanıcı ismi.
- tabloalanı_ismi
- Tablonun taşınacağı yeni tablo alanı
ismi.
EK BİLGݶ
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.
ÖRNEKLER¶
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;
UYUMLULUK¶
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.
ÇEVİREN¶
Nilgün Belma Bugüner <nilgun (at)
belgeler·gen·tr>, Mart 2005