Məzmuna keç
Educora
İrəli18 dəq11 / 22

CREATE TABLE: məlumat tipləri və məhdudiyyətlər

Öz cədvəllərini yarat, sütunlara düzgün tip seç və PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT, FOREIGN KEY ilə səhv məlumatın qarşısını al.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • CREATE TABLE ilə cədvəl yaratmaq və ALTER TABLE, DROP TABLE ilə onu dəyişmək
  • Müxtəlif VBİS-lərdə məlumat tiplərini seçmək
  • Məhdudiyyətlərlə məlumatın düzgünlüyünü qorumaq

İndiyə qədər hazır cədvəllərlə işlədik. Bəs onları kim və necə qurur? Yaxşı cədvəl təkcə sütunlar siyahısı deyil, həm də qaydalar toplusudur: soyadsız şagird, mənfi qiymət və ya eyni e-poçtla iki istifadəçi bazaya ümumiyyətlə düşməməlidir. Bu dərsdə məktəb dərnəkləri üçün öz cədvəllərimizi yaradacağıq.

CREATE TABLE

CREATE TABLE ad (...) mötərizədə hər sütunun adını, tipini və qaydalarını sadalayır. Aşağıda clubs (dərnəklər) cədvəli yaradılır: id — əsas açar, name — boş və təkrar ola bilməz, max_members — yazılmasa 20 olur və müsbət 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;
▸ Gözlənilən nəticə
id | name | room | max_members
1 | Chess club | 201 | 20
2 | Robotics | Lab 2 | 20
3 | Debate | 105 | 12
İlk iki dərnəkdə max_members yazılmayıb, ona görə DEFAULT qiyməti — 20 götürülüb.

Məlumat tipləri

Hər sütunun tipi var: tam ədəd, kəsr ədəd, mətn, tarix. MySQL, PostgreSQL və SQL Server tipə ciddi əməl edir: tam ədəd sütununa mətn yazmaq olmur. Tiplərin adları isə VBİS-dən VBİS-ə fərqlənir.

MəlumatSQLiteMySQLPostgreSQLSQL Server
Tam ədədINTEGERINTINTEGERINT
Dəqiq kəsr (pul)yoxdur: qəpiklə INTEGERDECIMAL(10, 2)NUMERIC(10, 2)DECIMAL(10, 2)
MətnTEXTVARCHAR(100)VARCHAR(100), TEXTNVARCHAR(100)
TarixTEXT ('2025-09-15')DATEDATEDATE
Doğru / yalanINTEGER (0/1)BOOLEANBOOLEANBIT
Avtomatik nömrəINTEGER PRIMARY KEYINT AUTO_INCREMENTINTEGER GENERATED ALWAYS AS IDENTITYINT IDENTITY(1, 1)
VARCHAR(100) — ən çoxu 100 simvolluq mətn; DECIMAL(10, 2) — 10 rəqəmli, onlardan 2-si vergüldən sonra olan ədəd.

SQLite-da isə tip yalnız tövsiyədir (type affinity). O, qiyməti tipə çevirməyə çalışır: '15' mətni tam ədəd sütununda 15 ədədinə çevrilir, 'abc' isə çevrilə bilmədiyi üçün mətn olaraq qalır. TYPEOF() funksiyası qiymətin əslində hansı tipdə saxlandığını göstərir.

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;
▸ Gözlənilən nəticə
n | n_type | s | s_type
abc | text | 42 | text
15 | integer | 7 | text
SQL
SELECT 0.1 + 0.2 AS result;
▸ Gözlənilən nəticə
result
0.30000000000000004

Məhdudiyyətlər

Məhdudiyyət (constraint) VBİS-in hər INSERT və UPDATE-də yoxladığı qaydadır. Qayda pozulursa, əmr rədd edilir və cədvəl dəyişmir. Səhvi təkcə proqramda deyil, bazada da tutmaq etibarlıdır: məlumatı hansı proqram yazsa da, qayda işləyir.

  • PRIMARY KEY — hər sətrin unikal identifikatoru; təkrar ola bilməz.
  • NOT NULL — sütun boş (NULL) qala bilməz.
  • UNIQUE — iki sətirdə eyni qiymət ola bilməz (məsələn, e-poçt).
  • DEFAULT — qiymət yazılmayanda istifadə olunan qiymət.
  • CHECK (şərt) — şərt doğru olmalıdır, məsələn, price >= 0.
  • FOREIGN KEY / REFERENCES — qiymət başqa cədvəldə mövcud olmalı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
▸ Gözlənilən nəticə
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);
▸ Gözlənilən nəticə
Error: CHECK constraint failed: positive_max
CONSTRAINT positive_max qaydaya ad verir — xəta mesajında onu görmək rahatdır.

FOREIGN KEY: cədvəllər arasında əlaqə

club_members cədvəli hansı şagirdin hansı dərnəkdə olduğunu saxlayır. REFERENCES clubs(id) deyir ki, club_id mövcud dərnəyə istinad etməlidir. UNIQUE (club_id, student_id) bir şagirdin eyni dərnəyə iki dəfə yazılmasına imkan vermir. Diqqət: SQLite köhnə proqramlarla uyğunluq üçün xarici açarları susmaya görə yoxlamır — PRAGMA foreign_keys = ON yazmaq lazımdır. MySQL (InnoDB), PostgreSQL və SQL Server isə onları susmaya görə yoxlayır.

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;
▸ Gözlənilən nəticə
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);
▸ Gözlənilən nəticə
Error: FOREIGN KEY constraint failed
PRAGMA sətrini silsən, SQLite bu səhv sətri səssizcə qəbul edəcək.

Cədvəli dəyişmək və silmək

ALTER TABLE ... ADD COLUMN mövcud cədvələ yeni sütun əlavə edir; köhnə sətirlər həmin sütunda DEFAULT qiymətini alır. Aşağıda məhsullara endirim sütunu əlavə edib oyunlara 15% endirim veririk.

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;
▸ Gözlənilən nəticə
name | price | discount | final_price
Desk lamp | 34.99 | 0 | 34.99
Chess set | 42 | 0.15 | 35.7
Tapşırıq

Sinif otaqları üçün rooms cədvəli yarat: id — əsas açar, name — boş ola bilməyən və təkrarlanmayan mətn, seats — susmaya görə 30 olan və 0-dan böyük olmalı tam ədəd. Sonra Lab 1 otağını 24 yerlə, Hall A otağını isə yer sayı göstərmədən əlavə et və name, seats sütunlarını id-yə görə sıralanmış göstər.

Tapşırıq · SQL
CREATE TABLE rooms (
  id INTEGER PRIMARY KEY
  -- name and seats with their constraints
);

-- insert the two rooms, then SELECT
▸ Gözlənilən nəticə
name | seats
Lab 1 | 24
Hall A | 30
Tapşırıq

courses cədvəlinə susmaya görə 0 olan tam ədəd tipli rating sütunu əlavə et. Informatics fənninin kursunun reytinqini 5 et. Sonra krediti 3 olan kursların adını (title) və reytinqini id-yə görə sıralanmış göstər.

Tapşırıq · SQL
-- 1) ALTER TABLE ...
-- 2) UPDATE ...
-- 3) SELECT ...
▸ Gözlənilən nəticə
title | rating
Geometry | 0
Organic Chemistry | 0
Python Basics | 5

Əsas fikirlər

  • CREATE TABLE sütunların adını, tipini və qaydalarını müəyyən edir.
  • Tip adları VBİS-lərdə fərqlidir; SQLite tiplərə sərbəst, digərləri ciddi yanaşır.
  • PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT səhv məlumatı bazanın özündə dayandırır.
  • REFERENCES mövcud olmayan sətrə istinadı qadağan edir; SQLite-da PRAGMA foreign_keys = ON lazımdır.
  • ALTER TABLE cədvəli dəyişir, DROP TABLE isə onu birdəfəlik silir.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Hansı məhdudiyyət sütunun boş qalmasını qadağan edir?