6.2 CREATE TABLE

<< İç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> [, …] )]

6.2.1 Sütun tanımı

<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
);

6.2.2 Tablo düzeyi kısıtlar

[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.

6.2.3 Tablo yan tümceleri

Yan tümceDurum
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 BYTanınmaz.
TABLESPACETanı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'
);

6.2.4 ATTRIBUTES — nesne öznitelikleri

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:

BildirimYan tümcenin yeri
CREATE TABLEsü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 DOMAINtipin (ve DEFAULT/NOT NULL/CHECK'in) ardından
CREATE INDEXanahtar listesinden sonra
CREATE VIEWsü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 / PROCEDUREparametre 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.

Koşullu öznitelik: FILTER, USING ve Metadata paketi

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.

Not

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.