İçeriğe geç
Educora
İleri18 dk11 / 22

CREATE TABLE: veri tipleri ve kısıtlamalar

Kendi tablolarını oluştur, sütunlar için doğru tipi seç ve PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT, FOREIGN KEY ile hatalı verinin önüne geç.

Kendini test et
Bu derste öğreneceklerin
  • CREATE TABLE ile tablo oluşturmak, ALTER TABLE ve DROP TABLE ile değiştirmek
  • Farklı VTYS'lerde veri tiplerini seçmek
  • Kısıtlamalarla verinin doğruluğunu korumak

Şimdiye kadar hazır tablolarla çalıştık. Peki onları kim, nasıl kurar? İyi bir tablo yalnızca bir sütun listesi değil, aynı zamanda bir kurallar bütünüdür: soyadı olmayan bir öğrenci, eksi bir fiyat ya da aynı e-postaya sahip iki kullanıcı veritabanına hiç girmemelidir. Bu derste okul kulüpleri için kendi tablolarımızı oluşturacağız.

CREATE TABLE

CREATE TABLE ad (...) parantez içinde her sütunun adını, tipini ve kurallarını sıralar. Aşağıda clubs (kulüpler) tablosu oluşturuluyor: id birincil anahtardır, name boş olamaz ve tekrar edemez, max_members yazılmazsa 20 olur ve pozitif olmalıdır.

SQL
CREATE TABLE clubs (
  id          INTEGER PRIMARY KEY,
  name        TEXT NOT NULL UNIQUE,
  room        TEXT,
  max_members INTEGER DEFAULT 20
              CONSTRAINT positive_max CHECK (max_members > 0)
);

INSERT INTO clubs (name, room) VALUES ('Chess club', '201'), ('Robotics', 'Lab 2');
INSERT INTO clubs (name, room, max_members) VALUES ('Debate', '105', 12);

SELECT * FROM clubs ORDER BY id;
▸ Beklenen çıktı
id | name | room | max_members
1 | Chess club | 201 | 20
2 | Robotics | Lab 2 | 20
3 | Debate | 105 | 12
İlk iki kulüp için max_members yazılmadığından DEFAULT değeri olan 20 kullanıldı.

Veri tipleri

Her sütunun bir tipi vardır: tam sayı, ondalıklı sayı, metin, tarih. MySQL, PostgreSQL ve SQL Server tiplere sıkı sıkıya uyar: tam sayı sütununa metin yazılamaz. Tiplerin adları ise VTYS'den VTYS'ye değişir.

VeriSQLiteMySQLPostgreSQLSQL Server
Tam sayıINTEGERINTINTEGERINT
Kesin ondalık (para)yok: kuruş cinsinden INTEGERDECIMAL(10, 2)NUMERIC(10, 2)DECIMAL(10, 2)
MetinTEXTVARCHAR(100)VARCHAR(100), TEXTNVARCHAR(100)
TarihTEXT ('2025-09-15')DATEDATEDATE
Doğru / yanlışINTEGER (0/1)BOOLEANBOOLEANBIT
Otomatik numaraINTEGER PRIMARY KEYINT AUTO_INCREMENTINTEGER GENERATED ALWAYS AS IDENTITYINT IDENTITY(1, 1)
VARCHAR(100) en fazla 100 karakterlik metindir; DECIMAL(10, 2) ise 10 basamaklı, 2 basamağı virgülden sonra olan bir sayıdır.

SQLite'ta ise tip yalnızca bir öneridir (type affinity). SQLite değeri sütun tipine çevirmeye çalışır: '15' metni tam sayı sütununda 15 sayısına dönüşür, 'abc' ise çevrilemediği için metin olarak kalır. TYPEOF() fonksiyonu bir değerin gerçekte hangi tipte saklandığını gösterir.

SQL
CREATE TABLE t (n INTEGER, s TEXT);
INSERT INTO t VALUES ('abc', 42), ('15', 7);

SELECT n, TYPEOF(n) AS n_type,
       s, TYPEOF(s) AS s_type
FROM t;
▸ Beklenen çıktı
n | n_type | s | s_type
abc | text | 42 | text
15 | integer | 7 | text
SQL
SELECT 0.1 + 0.2 AS result;
▸ Beklenen çıktı
result
0.30000000000000004

Kısıtlamalar

Kısıtlama (constraint), VTYS'nin her INSERT ve UPDATE sırasında denetlediği bir kuraldır. Kural çiğnenirse komut reddedilir ve tablo değişmez. Hataları yalnızca uygulamada değil, veritabanında yakalamak güvenilirdir: veriyi hangi program yazarsa yazsın kural çalışır.

  • PRIMARY KEY — her satırın benzersiz kimliği; tekrar edemez.
  • NOT NULL — sütun boş (NULL) kalamaz.
  • UNIQUE — iki satırda aynı değer olamaz (örneğin e-posta).
  • DEFAULT — değer yazılmadığında kullanılan değer.
  • CHECK (koşul) — koşul sağlanmalıdır, örneğin price >= 0.
  • FOREIGN KEY / REFERENCES — değer başka bir tabloda bulunmalıdır.
SQL
CREATE TABLE clubs (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL UNIQUE
);

INSERT INTO clubs (name) VALUES ('Chess club');
INSERT INTO clubs (name) VALUES ('Chess club');  -- same name again
▸ Beklenen çıktı
Error: UNIQUE constraint failed: clubs.name
SQL
CREATE TABLE clubs (
  id          INTEGER PRIMARY KEY,
  name        TEXT NOT NULL UNIQUE,
  max_members INTEGER DEFAULT 20
              CONSTRAINT positive_max CHECK (max_members > 0)
);

INSERT INTO clubs (name, max_members) VALUES ('Drama', 0);
▸ Beklenen çıktı
Error: CHECK constraint failed: positive_max
CONSTRAINT positive_max kurala bir ad verir; böylece hata iletisinde kolayca tanınır.

FOREIGN KEY: tablolar arası bağlantı

club_members tablosu hangi öğrencinin hangi kulüpte olduğunu tutar. REFERENCES clubs(id), club_id sütununun var olan bir kulübe başvurması gerektiğini söyler. UNIQUE (club_id, student_id) bir öğrencinin aynı kulübe iki kez yazılmasını engeller. Dikkat: SQLite eski programlarla uyumluluk için yabancı anahtarları varsayılan olarak denetlemez; PRAGMA foreign_keys = ON yazmak gerekir. MySQL (InnoDB), PostgreSQL ve SQL Server ise onları varsayılan olarak denetler.

SQL
PRAGMA foreign_keys = ON;

CREATE TABLE clubs (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL UNIQUE
);
CREATE TABLE club_members (
  id         INTEGER PRIMARY KEY,
  club_id    INTEGER NOT NULL REFERENCES clubs(id),
  student_id INTEGER NOT NULL REFERENCES students(id),
  UNIQUE (club_id, student_id)
);

INSERT INTO clubs (name) VALUES ('Chess club'), ('Robotics');
INSERT INTO club_members (club_id, student_id) VALUES (1, 3), (1, 6), (2, 10);

SELECT c.name AS club, s.first_name
FROM club_members AS m
JOIN clubs    AS c ON c.id = m.club_id
JOIN students AS s ON s.id = m.student_id
ORDER BY c.name, s.first_name;
▸ Beklenen çıktı
club | first_name
Chess club | Leyla
Chess club | Rəşad
Robotics | Kamran
SQL
PRAGMA foreign_keys = ON;

CREATE TABLE clubs (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
CREATE TABLE club_members (
  id         INTEGER PRIMARY KEY,
  club_id    INTEGER NOT NULL REFERENCES clubs(id),
  student_id INTEGER NOT NULL REFERENCES students(id)
);

INSERT INTO clubs (name) VALUES ('Chess club');
-- there is no club 5 and no student 99
INSERT INTO club_members (club_id, student_id) VALUES (5, 99);
▸ Beklenen çıktı
Error: FOREIGN KEY constraint failed
PRAGMA satırını silersen SQLite bu hatalı satırı sessizce kabul eder.

Tabloyu değiştirme ve silme

ALTER TABLE ... ADD COLUMN var olan bir tabloya yeni bir sütun ekler; eski satırlar bu sütunda DEFAULT değerini alır. Aşağıda ürünlere bir indirim sütunu ekleyip oyunlara %15 indirim veriyoruz.

SQL
ALTER TABLE products ADD COLUMN discount REAL DEFAULT 0;

UPDATE products SET discount = 0.15 WHERE category = 'Games';

SELECT name, price, discount,
       ROUND(price * (1 - discount), 2) AS final_price
FROM products
WHERE category IN ('Games', 'Home')
ORDER BY id;
▸ Beklenen çıktı
name | price | discount | final_price
Desk lamp | 34.99 | 0 | 34.99
Chess set | 42 | 0.15 | 35.7
Alıştırma

Sınıflar için bir rooms tablosu oluştur: id birincil anahtar, name boş olamayan ve tekrar edemeyen bir metin, seats ise varsayılan değeri 30 olan ve 0'dan büyük olması gereken bir tam sayı olsun. Sonra Lab 1 odasını 24 kişilik, Hall A odasını ise kişi sayısı vermeden ekle ve name, seats sütunlarını id değerine göre sıralı göster.

Alıştırma · SQL
CREATE TABLE rooms (
  id INTEGER PRIMARY KEY
  -- name and seats with their constraints
);

-- insert the two rooms, then SELECT
▸ Beklenen çıktı
name | seats
Lab 1 | 24
Hall A | 30
Alıştırma

courses tablosuna varsayılan değeri 0 olan tam sayı tipinde bir rating sütunu ekle. Informatics branşındaki derse 5 puan ver. Sonra kredisi 3 olan derslerin adını (title) ve puanını id değerine göre sıralı göster.

Alıştırma · SQL
-- 1) ALTER TABLE ...
-- 2) UPDATE ...
-- 3) SELECT ...
▸ Beklenen çıktı
title | rating
Geometry | 0
Organic Chemistry | 0
Python Basics | 5

Önemli noktalar

  • CREATE TABLE sütunların adlarını, tiplerini ve kurallarını belirler.
  • Tip adları VTYS'lere göre değişir; SQLite tiplere esnek, diğerleri katı yaklaşır.
  • PRIMARY KEY, NOT NULL, UNIQUE, CHECK ve DEFAULT hatalı veriyi veritabanının kendisinde durdurur.
  • REFERENCES var olmayan bir satıra başvurmayı yasaklar; SQLite'ta PRAGMA foreign_keys = ON gerekir.
  • ALTER TABLE tabloyu değiştirir, DROP TABLE ise onu kalıcı olarak siler.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Hangi kısıtlama bir sütunun boş kalmasını yasaklar?