|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 6. Veri tanımlama (DDL) > 6.2 CREATE TABLE |
CREATE [OR REPLACE | OR ALTER]
[GLOBAL TEMPORARY | LOCAL TEMPORARY | EXTERNAL | VIRTUAL <tip>] TABLE [şema.]ad
( <sütun-veya-kısıt> [, …] )
[ON COMMIT {DELETE | PRESERVE} ROWS]
[ATTRIBUTES ( ad = <sabit> [, …] )]<ad> <tip>
[CHARACTER SET <cs>] [COLLATE <coll>]
[DEFAULT <ifade> | = <ifade>]
[GENERATED {ALWAYS | BY DEFAULT [ON NULL]} AS IDENTITY [ ( <dizi-öznitelikleri> ) ]]
[GENERATED ALWAYS AS ( <ifade> ) | COMPUTED BY ( <ifade> )]
[NOT NULL | NULL] [<satır içi kısıt> …]
[ATTRIBUTES ( ad = <sabit> [, …] )]Kimlik (identity) sütunu tablo başına bir tanedir, ölçeği sıfır olan bir tam sayı tipinde
olmalıdır, örtük olarak NOT NULL'dur ve arkasında
<tablo>$<sütun>$SEQ adlı bir dizi oluşturulur (Firebird'de 63 karakteri aşan ad
indekslerdeki gibi $<nesne-kimliği> ekiyle kırpılır).
Sütun düzeyinde (satır içi) PRIMARY KEY, UNIQUE,
CHECK ve REFERENCES yazılabilir; kurulan kısıt tablo düzeyindekiyle
aynı nesnedir ve çalışma zamanında gerçekten zorlanır.
CONSTRAINT <ad> ile adlandırılabilir. SQL:2011 11.7 gereği
PRIMARY KEY sütunlarına örtük NOT NULL konur (tablo düzeyi anahtarlarda
da). Hesaplanan sütun (GENERATED ALWAYS AS ( <ifade> ); Firebird yazımı
COMPUTED BY ( <ifade> ) aynı tanımdır) değerini satır yazılırken ifadeden alır ve
saklar; GENERATED BY DEFAULT AS ( <ifade> ) yazımı yoktur.
Satır içi yabancı anahtarın yazımı şudur; sütun listesi isteğe bağlıdır ve
yazılmazsa hedef tablonun birincil anahtarı alınır (SQL:2011 11.8). Hedefin birincil anahtarı yoksa
ya da bir ifade anahtarıysa liste zorunludur ve eksikliği adıyla bildirilir. Aynı sütunda
PRIMARY KEY / UNIQUE ile birlikte yazılabilir.
<sütun> <tip> [CONSTRAINT <ad>] REFERENCES <tablo> [ ( <sütunlar> ) ]
[ON UPDATE <eylem>] [ON DELETE <eylem>]create table t
(
id integer primary key, -- ortuk NOT NULL
code varchar(10) unique,
v integer constraint t_v_pos check (v > 0),
b integer generated always as (v + 1),
pid integer references t2, -- t2'nin birincil anahtarina
qid integer constraint t_qid_fk references t2 (id) on delete cascade
);[CONSTRAINT <ad>] PRIMARY KEY ( <ifade listesi> ) [<indeks>]
[CONSTRAINT <ad>] UNIQUE ( <ifade listesi> ) [<indeks>]
[CONSTRAINT <ad>] CHECK ( <mantıksal ifade> )
[CONSTRAINT <ad>] POLICY ( <mantıksal ifade> )
[CONSTRAINT <ad>] FOREIGN KEY ( <sütunlar> ) REFERENCES <tablo> ( <sütunlar> )
[ON UPDATE <eylem>] [ON DELETE <eylem>] [<indeks>]
<indeks> ::= USING [ASC | ASCENDING | DESC | DESCENDING] INDEX <indeks adı>Tablo düzeyi her kısıtın sonuna ATTRIBUTES ( ad = <sabit> [, …] ) yazılabilir;
satır içi kısıt bu yan tümceyi almaz — oradaki ATTRIBUTES sütunundur.
Bkz. ATTRIBUTES — nesne öznitelikleri.
USING [DESC] INDEX <ad> (Firebird yazımı) anahtar kısıtının depodaki indeksine ad ve yön verir;
satır içi PRIMARY KEY, UNIQUE ve REFERENCES'ın ardına da yazılır. Firebird'e ve
Firebird dönüştürmesine olduğu gibi gider. PostgreSQL ve sqlite'ta karşılığı yoktur: orada kısıtın indeksi kısıtın
adını taşır, yan tümce yalnız katalogda durur (EXPORT LEVEL ve UPGRADE LEVEL onu taşır).
ADOPT Firebird'te kısıtın indeksi kendi adından farklıysa ya da azalansa bu yan tümceyi geri yazar.
<eylem>: NO ACTION, SET NULL,
SET DEFAULT, CASCADE, RESTRICT. İki ON yan
tümcesi her biri en çok bir kez, sırası serbesttir. Sütun sayıları eşleşmek zorundadır.
REFERENCES'ın sütun listesi satır içinde de tablo düzeyinde de isteğe bağlıdır;
yazılmazsa hedef tablonun PRIMARY KEY'i kullanılır, hedefte PK yoksa
derleme hatasıdır.
Bir tabloda en çok bir PRIMARY KEY olabilir (SQL:2011 11.7);
ikincisi — satır içi ile tablo düzeyinin karışımı da dâhil — derleme hatasıdır ve mesaj var olan
kısıtın adını söyler. UNIQUE sayısı sınırsızdır.
Aynı sütun listesi ve aynı hedef için ikinci bir FOREIGN KEY
bildirmek — satır içi REFERENCES ile tablo düzeyi yazımın yan yana gelmesi de dâhil —
derleme uyarısı verir, hata değil: iki kısıt da kurulur ve ikisi de uygulanır,
yani sonuç yanlış değil gereksizdir. PRIMARY KEY'deki hatadan farkı şudur: orada üretilen şemayı
kalıcı motorlar kabul etmez, burada eder. Kısıta ad verilip aynı ad iki kez kullanılırsa bu
hatadır.
POLICY lehçeye özgüdür; satır düzeyi erişim koşulu tanımlar.
Kısıt sonradan da eklenebilir (SQL:2011 11.10):
ALTER TABLE <ad> ADD [CONSTRAINT <ad>] PRIMARY KEY | UNIQUE | CHECK | POLICY | FOREIGN KEY …
ALTER TABLE <ad> DROP CONSTRAINT <ad> [RESTRICT | CASCADE]Yazım yukarıdaki tablo düzeyi kısıtla aynıdır. Tablonun mevcut satırları yeni
kısıtı sağlamıyorsa deyim reddedilir; hata adı her depolama motorunda aynıdır:
UNIQUE_VIOLATION, PK sütununda NULL için NOT_NULL_VIOLATION,
FOREIGN_KEY_VIOLATION, CHECK için CHECK iletisi. Reddedilen deyim COMMIT'te yeniden
denenmez. Eklenen PRIMARY KEY'in sütunları NOT NULL olur. Kısıt deyim anında geçerlidir
ve ROLLBACK ile geri alınır; Firebird'de, diğer ALTER TABLE eylemleri gibi,
COMMIT'te uygulanır. Adsız kısıt IVD$PK_<kimlik> biçiminde bir ad alır.
DROP CONSTRAINT kısıtı deyim anında düşürür, ROLLBACK geri
getirir. Düşen PRIMARY KEY'in sütunları NOT NULL kalır. Bir PRIMARY KEY ya da
UNIQUE kısıtına dayanan (aynı tabloya ve aynı sütunlara başvuran) yabancı anahtar varsa
RESTRICT (öndeğer) deyimi reddeder; CASCADE o yabancı anahtarları da
düşürür.
| Yan tümce | Durum |
|---|---|
ON COMMIT {DELETE|PRESERVE} ROWS |
Yalnız geçici tablolarda yazılır; yazılmazsa DELETE ROWS geçerlidir. Kalıcı tabloda tanınmaz. |
ATTRIBUTES ( … ) |
Tablo, sütun ve tablo düzeyi kısıt düzeyinde; DOMAIN, VIEW (ve sütunu), INDEX, yordam
(ve parametresi) bildirimlerinde de var, ALTER … SET ATTRIBUTES ile sonradan
yazılır — bkz. ATTRIBUTES. Dış tablo dosya bilgileri buradadır. |
PARTITION BY | Tanınmaz. |
TABLESPACE | Tanınmaz. |
Tablo düzeyinde STORAGE ENGINE |
Yok — depolama motoru yalnızca CREATE DATABASE'te seçilir. |
AS <select> (CTAS), LIKE <tablo>, INHERITS, WITH (…) |
Yok. |
Dış tablo örneği — biçim bilgisinin tamamı ATTRIBUTES içinde verilir:
create external table EXTTABLE1
(
STOK_NO integer attributes (DataEncoding = 'text', DataSize = 11),
AKTIF char(1) attributes (Hidden = true, Selectable = false, DataSize = 1),
STOK_KODU varchar(24) attributes (DataSize = 24)
)
attributes
(
characterSet = 'ANSI', type = 'fixed', file = 'e:\dosya.txt', EndOfLine = c'\r\n'
);ATTRIBUTES ( ad = <sabit> [, …] ) bir katalog nesnesine tipli ad/değer çiftleri
iliştirir; çiftler SYS.IVD$OBJECT_ATTRIBUTES'a yazılır (ad büyük harfe çevrilir, değer
metin olarak, tipi IVD$TYPE'ta) ve OPEN DATABASE ile geri okunur. Motor
bunları yorumlamaz; uygulama katmanının metaverisini (ui.*, doc.* …) taşır.
Yan tümcenin yazılabildiği bildirimler:
| Bildirim | Yan tümcenin yeri |
|---|---|
CREATE TABLE | sütun listesinden sonra (tablo), sütun tanımının sonunda (sütun), tablo düzeyi kısıtın sonunda (kısıt) |
CREATE DOMAIN | tipin (ve DEFAULT/NOT NULL/CHECK'in) ardından |
CREATE INDEX | anahtar listesinden sonra |
CREATE VIEW | sütun takma adı listesinde her adın ardından (sütun) ve AS'ten önce (görünüm) — select'in sonuna konsaydı anahtar sözcük tablo takma adıyla karışırdı |
CREATE FUNCTION / PROCEDURE | parametre tanımının sonunda (parametre) ve RETURNS'ten sonra, AS'ten önce (yordam) |
ALTER DOMAIN <ad> SET ATTRIBUTES ( ad = <sabit> [, …] )
ALTER VIEW <ad> [RENAME TO <yeni>] SET ATTRIBUTES ( … )
ALTER INDEX <ad> SET ATTRIBUTES ( … )
ALTER TABLE <ad> SET ATTRIBUTES ( … )
ALTER TABLE <ad> ALTER [COLUMN] <sütun> SET ATTRIBUTES ( … )
ALTER PROCEDURE <ad> SET ATTRIBUTES ( … )
ALTER FUNCTION <ad> SET ATTRIBUTES ( … )
ALTER TRIGGER <ad> SET ATTRIBUTES ( … )
ALTER SCHEMA <şema> ALTER [COLUMN] NAME <kolon> SET ATTRIBUTES ( … )
COMMENT ON COLUMN NAME <şema>.<kolon> IS '…'SET ATTRIBUTES birleştirir: verilen adlar yazılır (var olan aynı ad
üzerine), verilmeyenler durur; bir özniteliği kaldıran biçim yoktur. DOMAIN/VIEW/INDEX'te öteki
ALTER yan tümceleri gibi COMMIT'te uygulanır; ALTER TABLE
deyim anında canlı tabloya uygulanır ve ROLLBACK eski çantayı geri kurar.
ALTER PROCEDURE | FUNCTION | TRIGGER … SET ATTRIBUTES yeniden tanım değildir:
yordamın kaynağı, derlenmiş gövdesi, yazım sayacı ve depodaki karşılığı aynı kalır, yalnız öznitelik satırları
yazılır; seviye yükseltmesi bu öznitelikleri (ve COMMENT ON açıklamasını) yordamı yeniden kurmadan
taşır. Ad tek bir nesneyi göstermelidir: aşırı yüklü bir ad reddedilir, ALTER PROCEDURE bir işlevi
bulmaz. Tetikleyici adla nitelenemez, arama yolundaki şemada aranır. Yordamın öteki ALTER'ları yeniden
tanımdır. PostgreSQL çevriminde CREATE'teki öznitelikler üretilmez, ALTER … SET ATTRIBUTES
hedef metin üretmez (IVEDI'ye özel).
Ad kuralı: ALTER SCHEMA … ALTER COLUMN NAME ve COMMENT ON COLUMN NAME, o
şemadaki bu adı taşıyan bütün tablo ve görünüm kolonlarına öznitelik ve açıklama verir (her tabloda
bulunan sistem alanları için tek tanım). Kural IVD$COLUMN_RULES tablosunda saklanır
(IVD$V_COLUMN_RULES görünümü); = NULL ya da
IS '' kaldırır, FOR LOCALE kabul edilmez. Bir kolonun etkin değeri şu sırayla
aranır: kolonun kendi değeri > görünüm kolonuysa kaynak kolonun etkin değeri (kaynağın kendisi, onun kaynağı, kaynağın
adıyla ad kuralı, kaynağın domain'i) > kolonun kendi adıyla ad kuralı > domain.
Sık kullanılan öznitelikler (ui.*, lookup.*, enum.values,
dx.*, web.*, doc.*, ns.*, sec.class) satır olarak değil
IVD$OBJECT_PROPS tablosunun kolonları olarak saklanır; FILTER'lı değer kendi koşulunun satırındadır.
Sözdizimi ve okuma aynıdır; IVD$V_ATTRIBUTES bunları da satır olarak gösterir. Kısa öznitelik değerleri en çok
255 karakterdir (aşan değer reddedilir); açıklama niteliğindeki uzun öznitelikler sınırsızdır. Görünüm kolonunun kaynağı (kaynak kolon ve SELECT'teki takma adı) görünüm her kaydedildiğinde
katalogda tutulur; ifade kolonunun kaynağı yoktur. Sınama modülü: sqltest/ddl/test29-attributes.sql.
Tırnaksız ad büyük harfe çevrilir (ui_caption → UI_CAPTION); noktalı sözlük adları
tırnakla olduğu gibi kalır ("ui.caption"). İki ad çantaya girmez, sabit slota gider:
"ns.guid" = '{…}' ve kısa yazımı GUID = '{…}' nesnenin
ivd$objects.ivd$guid_object_id kolonuna yazılır, öznitelik satırı olarak tekrarlanmaz; bkz.
Sürüm sayacı ve GUID, veritabanı kimlik kartı, depo lehçesinde ifade (NATIVE_SQL), seviye sınırı ve damgalar, seviye paketleri, benimseme ve UPGRADE TABLE, IVD$V_* sistem görünümleri.
Bir öznitelik satırı bir koşul taşıyabilir:
ATTRIBUTES ("ui.caption" = 'Cari', "ui.caption" = 'Müşteri' FILTER (MODULE = 'M1'), "ui.caption" =
'Web Müşteri' FILTER (MODULE = 'M1' AND UI_FORM = 'WebForm1')). Aynı ad birden çok satırda olabilir; koşulsuz
satır taban değerdir. Koşul metni IVD$OBJECT_ATTRIBUTES.IVD$FILTER kolonuna olduğu gibi yazılır
(ad indeksi tekil değildir), SET ATTRIBUTES aynı ad + aynı koşul metnini değiştirir, farklı koşul
yeni satır ekler; OPEN DATABASE geri okur. Koşul bildirimde derlenmez: tanımlayıcıları okuma anındaki
parametrelerdir, sözdizimi hatası ilk okumada çıkar.
Okuyucu Metadata paketidir (bkz. Metadata paketi):
Metadata.Attribute(<nesne>, <ad>) USING (MODULE = 'M1', UI_FORM = 'WebForm1') etkin değeri
(skaler) döndürür; AttributeInfo, Attributes, AllAttributes ve
EffectiveAttribute aynı çözümü sonuç kümesi olarak verir. Nesne adı noktalı olabilir
(SEMA.TABLO, TABLO.KOLON) ve arama yolunda çözülür. Seçim CSS özgüllüğüdür: eşleşen koşullar arasında koşulda geçen parametre
sayısı fazla olan kazanır, eşitlikte sonraki bildirim; hiçbiri eşleşmezse taban. USING'de verilmeyen
parametre NULL'dur (üç değerli mantık: UI_FORM = 'x' eşleşmez, UI_FORM IS NULL eşleşir),
karşılıksız parametre yok sayılır. Koşul motorun kendi boolean ifadesidir (=, IN,
LIKE, AND/OR/NOT, IS NULL …) ve her okumada motorun derleyicisiyle koşulur
(önbellek yoktur).
f(args) USING (AD = değer, …) yan tümcesi genel bir çağrı biçimidir, ama yalnız
ALLOW USING diktesiyle bildirilen metotta geçerlidir (ALLOW NULLS gibi
parametre listesinin başında: CREATE FUNCTION f (ALLOW USING p1 integer, PARAMS ctx ARRAY OF VARIANT);
son parametre açık liste olmak zorundadır, yoksa bildirim reddedilir). Çiftler ('AD', değer) olarak o
listeye eklenir; ALLOW USING olmayan metotta USING hata. Görünen etiket, düzenleme deposu ve değer eşlemesi için sabit slot kolonu yoktur:
bu değerler yalnız "ui.caption", "dx.repo", "enum.values" öznitelikleridir.
Sınama modülü:
sqltest/ddl/test34-attribute_filter.sql.
VIRTUAL <tip> TABLE yazımında kabul edilen tek <tip>
DUAL'dır. Sanal tablolar (DUAL, dış tablolar) IVEDI_ONLY'dir: depoda
karşılıkları yoktur, depoya inen bir görünüm ya da yordam onlara başvuramaz (orada tek satırlık bir tablo
gerekiyorsa ivd$database kullanılır). Çeviride tek FROM öğesi DUAL ise
PostgreSQL metninde FROM yazılmaz, Firebird metninde FROM RDB$DATABASE yazılır.