Το CREATE TABLE προσθέτει έναν νέο πίνακα σε μια βάση δεδομένων. Δίνεις όνομα στον πίνακα και απαριθμείς τις στήλες του, καθεμία με έναν τύπο δεδομένων και τυχόν κανόνες (constraints) που πρέπει να τηρούν οι τιμές της. Τα παραδείγματα δουλεύουν σε PostgreSQL, MySQL, SQLite και SQL Server.
Πώς χρησιμοποιείς το CREATE TABLE
Δώσε όνομα στον πίνακα και μετά γράψε τις στήλες του σε παρενθέσεις, χωρισμένες με κόμματα. Κάθε στήλη έχει όνομα, τύπο δεδομένων και, προαιρετικά, constraints όπως PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT ή CHECK:
CREATE TABLE table_name (
column_name data_type constraints,
another_column data_type constraints
);
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
country CHAR(2) DEFAULT 'US',
signed_up DATE
);
INSERT INTO customers (id, name, email, signed_up)
VALUES (1, 'Ana Lima', 'ana@example.com', '2026-03-02');
SELECT * FROM customers;
-- Output:
-- id | name | email | country | signed_up
-- ---+----------+-----------------+---------+-----------
-- 1 | Ana Lima | ana@example.com | US | 2026-03-02
Ο νέος πίνακας είναι άδειος μέχρι να εισαγάγεις γραμμές σε αυτόν. Αυτό το insert παρέλειψε το country, οπότε η γραμμή πήρε την προεπιλεγμένη τιμή, US.
Κανόνες που πρέπει να ξέρεις
-
Η SQLite δεν επιβάλλει τύπους ή μήκη. Εκεί που άλλες βάσεις δεδομένων απορρίπτουν μια τιμή που δεν ταιριάζει στη στήλη, η SQLite την αποθηκεύει κανονικά. Πρόσθεσε
STRICTμετά την παρένθεση που κλείνει για να κάνει έλεγχο (ένας strict πίνακας δέχεται μόνο τους τύπουςINT,INTEGER,REAL,TEXT,BLOBκαιANY).
CREATE TABLE products (
sku VARCHAR(5),
quantity INTEGER
);
-- SQLite stores this row; other databases reject it with an error
INSERT INTO products VALUES ('LAMP-001', 'twelve');
SELECT sku, quantity FROM products;
-- Output (SQLite):
-- sku | quantity
-- ---------+---------
-- LAMP-001 | twelve
-
Δήλωσε ένα foreign key σε δική του γραμμή
FOREIGN KEY, όχι ωςREFERENCESμέσα στον ορισμό της στήλης: η MySQL 8 δέχεται αυτή τη σύντομη μορφή και μετά την αγνοεί. Η SQLite επιβάλλει foreign keys μόνο μετά απόPRAGMA foreign_keys = ON;, που το τρέχεις σε κάθε σύνδεση. -
Το CREATE TABLE αποτυγχάνει αν ο πίνακας υπάρχει ήδη. Γράψε
CREATE TABLE IF NOT EXISTSγια να τον παραλείψει. -
Στη MySQL, μια στήλη
TEXTδεν μπορεί να έχειDEFAULTήUNIQUE. ΧρησιμοποίησεVARCHAR(n), όπως κάνουν τα παραδείγματα εδώ.
Εναλλακτική σύνταξη
Τα αυτόματα αριθμημένα id γράφονται διαφορετικά σε κάθε βάση δεδομένων:
| Βάση δεδομένων | Στήλη id με αυτόματη αρίθμηση |
|---|---|
| PostgreSQL | id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY |
| MySQL | id INT AUTO_INCREMENT PRIMARY KEY |
| SQLite | id INTEGER PRIMARY KEY |
| SQL Server | id INT IDENTITY(1,1) PRIMARY KEY |
Άφησε το id έξω από ένα insert και η βάση δεδομένων συμπληρώνει τον επόμενο αριθμό.
Ο SQL Server έχει επίσης δικά του ονόματα για στήλες true/false και ημερομηνίας-ώρας, και δεν έχει IF NOT EXISTS. Χρησιμοποίησε BIT (με 1 και 0) αντί για BOOLEAN, DATETIME2 για ημερομηνία και ώρα (το δικό του TIMESTAMP είναι αριθμός έκδοσης γραμμής, όχι ημερομηνία), και έλεγξε το OBJECT_ID πριν δημιουργήσεις τον πίνακα:
-- SQL Server
IF OBJECT_ID('users', 'U') IS NULL
CREATE TABLE users (
id INT IDENTITY(1,1) PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
is_active BIT NOT NULL DEFAULT 1,
created_at DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Πότε να χρησιμοποιείς το CREATE TABLE;
Κάθε πίνακας ξεκινά με CREATE TABLE, αλλά οι στήλες και τα constraints που επιλέγεις λύνουν διαφορετικά προβλήματα.
Αποθήκευσε ένα νέο είδος δεδομένων
Κάθε είδος οντότητας που παρακολουθεί η εφαρμογή σου, όπως πελάτες, βιβλία ή τιμολόγια, παίρνει τον δικό του πίνακα, με μια στήλη για κάθε στοιχείο του και έναν τύπο που ταιριάζει στις τιμές.
Δώσε σε κάθε γραμμή ένα μοναδικό ID
Ένα PRIMARY KEY εμποδίζει δύο γραμμές να έχουν το ίδιο αναγνωριστικό, ώστε να μπορείς πάντα να βρίσκεις, να ενημερώνεις ή να συνδέεσαι με ακριβώς μία γραμμή. Άφησε τη βάση δεδομένων να αριθμεί τις γραμμές (δες την «Εναλλακτική σύνταξη» παραπάνω) ή συνδύασε δύο στήλες όταν χρειάζεται ένα ζεύγος τιμών για να αναγνωριστεί μια γραμμή.
Κράτα έξω λανθασμένα ή ελλιπή δεδομένα
Τα constraints απορρίπτουν γραμμές που παραβιάζουν τους κανόνες σου: NOT NULL για υποχρεωτικές στήλες, UNIQUE για τιμές όπως διευθύνσεις email, και CHECK για επιτρεπτά εύρη. Το DEFAULT συμπληρώνει μια στήλη που παραλείπει ένα insert.
Σύνδεσε σχετικούς πίνακες
Ένα FOREIGN KEY κάνει μια στήλη να δείχνει σε μια γραμμή άλλου πίνακα, ώστε μια παραγγελία να μην μπορεί να αναφέρει πελάτη που δεν υπάρχει. Πρόσθεσε ON DELETE CASCADE και η διαγραφή της γονικής γραμμής διαγράφει και τις γραμμές που δείχνουν σε αυτήν.
Αποθήκευσε αποτελέσματα query ως πίνακα
Το CREATE TABLE ... AS SELECT δημιουργεί έναν πίνακα και τον γεμίζει από ένα query σε μία εντολή. Χρησιμοποίησέ το για στιγμιότυπα, πίνακες αναφορών ή ένα backup γραμμών που πρόκειται να αλλάξεις.
Πραγματικά παραδείγματα CREATE TABLE
Τα μηνύματα σφάλματος είναι της PostgreSQL. Άλλες βάσεις δεδομένων απορρίπτουν τις ίδιες γραμμές με δική τους διατύπωση.
Πίνακας σύνδεσης με κλειδί δύο στηλών
Οι φοιτητές παρακολουθούν πολλά μαθήματα και τα μαθήματα έχουν πολλούς φοιτητές. Ο πίνακας enrollments τα συνδέει, και το primary key του είναι το ζεύγος των id, οπότε ένας φοιτητής μπορεί να γραφτεί σε πολλά μαθήματα αλλά όχι δύο φορές στο ίδιο:
CREATE TABLE enrollments (
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
enrolled_on DATE,
PRIMARY KEY (student_id, course_id)
);
INSERT INTO enrollments VALUES (1, 101, '2026-09-01');
INSERT INTO enrollments VALUES (1, 102, '2026-09-01');
INSERT INTO enrollments VALUES (1, 101, '2026-09-08');
-- ERROR: duplicate key value violates unique constraint "enrollments_pkey"
-- DETAIL: Key (student_id, course_id)=(1, 101) already exists.
SELECT * FROM enrollments;
-- Output:
-- student_id | course_id | enrolled_on
-- -----------+-----------+------------
-- 1 | 101 | 2026-09-01
-- 1 | 102 | 2026-09-01
Εγγραφές που τηρούν τους κανόνες
Κάθε λογαριασμός χρειάζεται μια διεύθυνση email που δεν χρησιμοποιεί κανένας άλλος λογαριασμός και τουλάχιστον μία θέση. Οι νέοι λογαριασμοί ξεκινούν στο δωρεάν πλάνο με μία θέση:
CREATE TABLE accounts (
id INTEGER PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
tier VARCHAR(20) NOT NULL DEFAULT 'free',
seats INTEGER NOT NULL DEFAULT 1 CHECK (seats > 0)
);
INSERT INTO accounts (id, email) VALUES (1, 'sam@example.com');
SELECT * FROM accounts;
-- Output:
-- id | email | tier | seats
-- ---+-----------------+------+------
-- 1 | sam@example.com | free | 1
INSERT INTO accounts (id, email) VALUES (2, 'sam@example.com');
-- ERROR: duplicate key value violates unique constraint "accounts_email_key"
INSERT INTO accounts (id, email, seats) VALUES (3, 'kim@example.com', 0);
-- ERROR: new row ... violates check constraint "accounts_seats_check"
INSERT INTO accounts (id) VALUES (4);
-- ERROR: null value in column "email" ... violates not-null constraint
Παραγγελίες που πρέπει να ανήκουν σε πελάτη
Κάθε παραγγελία δείχνει σε έναν πελάτη. Το foreign key απορρίπτει παραγγελία για πελάτη που δεν υπάρχει, και το ON DELETE CASCADE αφαιρεί τις παραγγελίες ενός πελάτη όταν αυτός διαγράφεται. Στη SQLite, τρέξε πρώτα PRAGMA foreign_keys = ON;.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
total DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
);
-- Input: customers
-- id | name
-- ---+-----------
-- 1 | Ana Lima
-- 2 | Ben Okafor
-- Input: orders
-- id | customer_id | total
-- ---+-------------+------
-- 10 | 1 | 25.00
-- 11 | 1 | 60.00
-- 12 | 2 | 42.50
INSERT INTO orders VALUES (13, 99, 15.00);
-- ERROR: ... violates foreign key constraint "orders_customer_id_fkey"
-- DETAIL: Key (customer_id)=(99) is not present in table "customers".
DELETE FROM customers WHERE id = 1;
-- Output (orders after the DELETE):
-- id | customer_id | total
-- ---+-------------+------
-- 12 | 2 | 42.50
Στιγμιότυπο ενεργών πελατών
Αντίγραψε τους πελάτες που παρήγγειλαν φέτος σε δικό τους πίνακα, για μια λίστα καμπάνιας που δεν πρέπει να αλλάζει καθώς έρχονται νέες παραγγελίες:
-- Input: customers
-- customer_id | name | email | last_order_date
-- ------------+------------+-------------------+----------------
-- 1 | Ana Lima | ana@example.com | 2026-03-18
-- 2 | Ben Okafor | ben@example.com | 2025-11-02
-- 3 | Chloe Park | chloe@example.com | 2026-06-30
-- 4 | Dev Shah | dev@example.com | NULL
CREATE TABLE active_customers AS
SELECT customer_id, name, email
FROM customers
WHERE last_order_date >= '2026-01-01';
-- SQL Server has no CREATE TABLE ... AS. Use SELECT ... INTO:
SELECT customer_id, name, email
INTO active_customers
FROM customers
WHERE last_order_date >= '2026-01-01';
-- Output (active_customers):
-- customer_id | name | email
-- ------------+------------+------------------
-- 1 | Ana Lima | ana@example.com
-- 3 | Chloe Park | chloe@example.com
Ο νέος πίνακας παίρνει τις στήλες, τους τύπους τους και τις γραμμές, αλλά όχι το primary key ή άλλα constraints. Πρόσθεσέ τα με ALTER TABLE αν τα χρειάζεσαι.
Περισσότερα για το CREATE TABLE
Σε αυτό το blog:
- Οδηγός για προσωρινούς πίνακες SQL: πίνακες που διαρκούν όσο το session σου
- SQL ALTER TABLE add column: αλλαγές σε έναν πίνακα αφού τον δημιουργήσεις
- Σύνθετα primary keys στην SQL: κλειδιά από περισσότερες από μία στήλες
- Πώς χρησιμοποιείς foreign keys στην PostgreSQL: foreign keys και οι ενέργειες διαγραφής τους σε βάθος
- Οδηγός για σχέσεις βάσεων δεδομένων: σχεδιασμός πινάκων που συνδέονται μεταξύ τους
- Η εντολή SQL INSERT: προσθήκη γραμμών σε νέο πίνακα
- Δημιουργός πινάκων SQL: φτιάξε μια εντολή CREATE TABLE στον browser σου αντί να τη γράφεις με το χέρι
Επίσημη τεκμηρίωση:
Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων
Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit
Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.
Τι λένε οι χρήστες για το Beekeeper Studio
«Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά ευχάριστη.»
«Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper βρίσκει την τέλεια ισορροπία ανάμεσα σε λειτουργίες και απλότητα. Απλώς δουλεύει.»