Capitol gratuit

Baze de Date și Tabele - CREATE, ALTER, DROP

-- Creare bază de date cu charset explicit CREATE DATABASE magazin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Vizualizare baze de date existente...

Gestionarea bazelor de date

-- Creare bază de date cu charset explicit
CREATE DATABASE magazin
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- Vizualizare baze de date existente
SHOW DATABASES;

-- Selectare bază de date activă
USE magazin;

-- Informații despre baza de date curentă
SELECT DATABASE();

-- Ștergere bază de date (cu verificare)
DROP DATABASE IF EXISTS test_db;

-- Modificare charset
ALTER DATABASE magazin
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Atenție: Folosiți mereu utf8mb4 în loc de utf8! În MySQL, utf8 suportă doar 3 bytes per caracter (nu include emoji-uri și unele caractere speciale). utf8mb4 suportă complet standardul Unicode cu 4 bytes.

Creare tabele

Să creăm o schemă completă pentru un magazin online:

-- Tabela categorii
CREATE TABLE categorii (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR(100) NOT NULL,
slug VARCHAR(100) NOT NULL UNIQUE,
parinte_id INT UNSIGNED DEFAULT NULL,
descriere TEXT,
ordine INT DEFAULT 0,
activ TINYINT(1) DEFAULT 1,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parinte_id) REFERENCES categorii(id) ON DELETE SET NULL,
INDEX idx_slug (slug),
INDEX idx_parinte (parinte_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela clienti
CREATE TABLE clienti (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
prenume VARCHAR(50) NOT NULL,
nume VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
telefon VARCHAR(20),
adresa TEXT,
oras VARCHAR(50),
judet VARCHAR(50),
cod_postal VARCHAR(10),
data_nastere DATE,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizat_la DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_email (email),
INDEX idx_oras (oras),
INDEX idx_nume (nume, prenume)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela produse
CREATE TABLE produse (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR(200) NOT NULL,
slug VARCHAR(200) NOT NULL UNIQUE,
descriere TEXT,
descriere_scurta VARCHAR(500),
pret DECIMAL(10,2) NOT NULL,
pret_redus DECIMAL(10,2) DEFAULT NULL,
stoc INT UNSIGNED DEFAULT 0,
sku VARCHAR(50) UNIQUE,
categorie_id INT UNSIGNED,
imagine VARCHAR(500),
greutate DECIMAL(8,3),
activ TINYINT(1) DEFAULT 1,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizat_la DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (categorie_id) REFERENCES categorii(id) ON DELETE SET NULL,
INDEX idx_categorie (categorie_id),
INDEX idx_pret (pret),
INDEX idx_stoc (stoc),
FULLTEXT INDEX idx_search (nume, descriere)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela comenzi
CREATE TABLE comenzi (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client_id INT UNSIGNED NOT NULL,
subtotal DECIMAL(10,2) NOT NULL,
transport DECIMAL(10,2) DEFAULT 0.00,
total DECIMAL(10,2) NOT NULL,
status ENUM('nou','confirmat','procesare','expediat','livrat','anulat','returnat') DEFAULT 'nou',
metoda_plata ENUM('card','ramburs','transfer','paypal') NOT NULL,
adresa_livrare TEXT NOT NULL,
note TEXT,
data_comanda DATETIME DEFAULT CURRENT_TIMESTAMP,
data_expediere DATETIME,
data_livrare DATETIME,
FOREIGN KEY (client_id) REFERENCES clienti(id) ON DELETE RESTRICT,
INDEX idx_client (client_id),
INDEX idx_status (status),
INDEX idx_data (data_comanda)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela detalii_comanda (many-to-many: comenzi <-> produse)
CREATE TABLE detalii_comanda (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
comanda_id INT UNSIGNED NOT NULL,
produs_id INT UNSIGNED NOT NULL,
cantitate INT UNSIGNED NOT NULL DEFAULT 1,
pret_unitar DECIMAL(10,2) NOT NULL,
total_linie DECIMAL(10,2) GENERATED ALWAYS AS (cantitate * pret_unitar) STORED,
FOREIGN KEY (comanda_id) REFERENCES comenzi(id) ON DELETE CASCADE,
FOREIGN KEY (produs_id) REFERENCES produse(id) ON DELETE RESTRICT,
INDEX idx_comanda (comanda_id),
INDEX idx_produs (produs_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE

-- Adăugare coloană nouă
ALTER TABLE clienti ADD COLUMN newsletter TINYINT(1) DEFAULT 0 AFTER email;

-- Modificare coloană existentă
ALTER TABLE clienti MODIFY COLUMN telefon VARCHAR(30);

-- Redenumire coloană
ALTER TABLE clienti RENAME COLUMN oras TO localitate;

-- Ștergere coloană
ALTER TABLE clienti DROP COLUMN cod_postal;

-- Adăugare index
ALTER TABLE produse ADD INDEX idx_activ_pret (activ, pret);

-- Ștergere index
ALTER TABLE produse DROP INDEX idx_stoc;

-- Adăugare foreign key
ALTER TABLE produse ADD CONSTRAINT fk_categorie
FOREIGN KEY (categorie_id) REFERENCES categorii(id) ON DELETE SET NULL;

-- Vizualizare structură
DESCRIBE clienti;
SHOW CREATE TABLE clienti;
SHOW COLUMNS FROM clienti;
SHOW TABLE STATUS LIKE 'clienti';

Constrângeri (Constraints)

Constrângere Descriere Exemplu
PRIMARY KEY Identificator unic, NOT NULL automat id INT PRIMARY KEY
UNIQUE Valori unice (permite NULL) email VARCHAR(100) UNIQUE
NOT NULL Nu permite valori NULL nume VARCHAR(50) NOT NULL
DEFAULT Valoare implicită activ TINYINT DEFAULT 1
CHECK Validare condiție (MySQL 8.0+) CHECK (pret > 0)
FOREIGN KEY Referință către altă tabelă FOREIGN KEY (cat_id) REFERENCES categorii(id)

Acțiuni Foreign Key

Acțiune ON DELETE ON UPDATE
RESTRICT Blochează ștergerea dacă există referințe Blochează modificarea
CASCADE Șterge și rândurile dependente Actualizează și referințele
SET NULL Setează FK la NULL Setează FK la NULL
SET DEFAULT Setează la valoarea default Setează la valoarea default
NO ACTION Echivalent cu RESTRICT Echivalent cu RESTRICT
Best Practice: Folosiți CASCADE cu precauție - doar când ștergerea părinte-ului trebuie să șteargă și copiii (ex: detalii_comanda când se șterge comanda). Folosiți RESTRICT pentru a preveni ștergerea accidentală (ex: nu permiteți ștergerea unui client care are comenzi).

Continuați cu restul cursului

Acesta este capitolul 3 din cele 14 ale cursului, cu 4 lecții din 67. Cumpărați cursul și parcurgeți tot conținutul în cont, cu progres salvat, test final și certificat.

Cumpărați cursul la 110 €