CREATE DATABASE
Limbajul pentru definirea datelor (DDL: Data Definition Language) permite descrierea bazelor da date si a componentelor acestora. Pentru crearea structurilor (baze de date, tabele, vizualizari), la nivelul limbajului DDL, este disponibila instructiunea CREATE.
Instructiunea SQL utilizata pentru a crea o structura de tip baza de date este CREATE DATABASE, cu urmatoarea sintaxa in cadrul sistemul de gestiune a bazelor de date MySQL.
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nume_baza_date
SCHEMA este un sinonim pentru DATABASE. Pentru a utiliza aceasta instructiune este necesar privilegiul CREATE, pentru baza de date care urmeaza a fi creata.
mysql> CREATE DATABASE sakila; ERROR 1044 (42000): Access denied for user 'stud'@'%' to database 'sakila'
In MySQL, o baza de date este implementata prin intermediul unui director, care contine fisierele corespunzatoare tabelelor bazei de date. La crearea bazei de date, instructiunea CREATE DATABASE creeaza un director (care contine doar un fisier db.opt) in locatia corespunzatoare datelor, pentru serverul MySQL.
mysql> CREATE DATABASE sakila; Query OK, 1 row affected
In cazul in care exista o baza de date cu numele specificat in instructiunea CREATE DATABASE si nu este utilizata clauza IF NOT EXISTS, este generat un mesaj de eroare (Can’t create database ‘sakila’; database exists).
mysql> CREATE DATABASE sakila; ERROR 1007 (HY000): Can't create database 'sakila'; database exists
CREATE TABLE
Crearea unui tabel, intr-o baza de date existenta, se realizeaza prin intermediul instructiunii CREATE TABLE, cu urmatoarea sintaxa.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nume_tabel (definitie_tabel)
definitie_tabel: nume_coloana1 tip_data [NOT NULL | NULL] [DEFAULT valoare_implicita] [AUTO_INCREMENT] [PRIMARY KEY], ..., [PRIMARY KEY(nume_coloana1, ...)]
Pentru a utiliza instructiunea CREATE TABLE este necesar privilegiul CREATE pentru tabelul care urmeaza a fi creat. Implicit, tabelul este creat in baza de date activa.
mysql> use sakila Database changed mysql> CREATE TABLE actor ( -> actor_id smallint(5) unsigned NOT NULL AUTO_INCREMENT, -> first_name varchar(45) NOT NULL, -> last_name varchar(45) NOT NULL, -> last_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -> PRIMARY KEY (actor_id), -> KEY idx_actor_last_name (last_name) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected
mysql> DESCRIBE actor; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(45) | NO | | NULL | | | last_name | varchar(45) | NO | MUL | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+
In definitia unui tabel pot fi utilizate urmatoarele optiuni pentru descrierea coloanelor: null, not null, default, auto_increment, primary key. Daca este prezenta optiunea NOT NULL la nivelul unei coloane, atunci nu sunt permise valori NULL in coloana (aceasta trebuie completata in orice situatie). Precizarea valorii NULL la nivelul unei coloane sau neprecizarea uneia din cele doua optiuni permite inserarea de valori NULL in coloana.
Stabilirea unei valori implicite pentru o coloana se face prin intermediul lui DEFAULT valoare_implicita. Aceasta optiune nu se aplica coloanelor de tip BLOB sau TEXT.
Optiunea AUTO_INCREMENT poate fi stabilita doar pentru o coloana de tip intreg sau real si stabileste faptul ca daca nu se insereaza nici o valoare pentru aceasta coloana, atunci se genereaza automat o valoare mai mare cu o unitate decat cea mai mare valoare din coloana. O singura coloana dintr-un tabel poate detine optiunea AUTO_INCREMENT. Coloana trebuie sa fie indexata si nu poate avea o valoare implicita.
Este posibila suprascrierea valorii generate prin intermediul optiunii AUTO_INCREMENT, pentru o coloana, daca se specifica o valoare pentru coloana respectiva, la inserarea unei inregistrari.
mysql> INSERT -> INTO actor (actor_id, last_name, first_name) -> VALUES (201, "BRUCE", "JOHNSON"); Query OK, 1 row affected
mysql> SELECT * -> FROM actor -> ORDER BY last_update DESC -> LIMIT 1; +----------+------------+-----------+---------------------+ | actor_id | first_name | last_name | last_update | +----------+------------+-----------+---------------------+ | 201 | JOHNSON | BRUCE | 2019-04-07 13:52:15 | +----------+------------+-----------+---------------------+
PRIMARY KEY specifica cheia primara pentru un tabel. O singura coloana din tabel poate detine optiunea PRIMARY KEY. Daca la formarea cheii primare participa mai multe coloane (cheie primara compusa), atunci cheia primara este specificata dupa definitiile coloanelor, astfel: PRIMARY KEY (nume_coloana1, nume_coloana2, …).
Crearea unei structuri de tip tabel poate fi realizata si pe baza definitiei unui alt tabel. Astfel, putem implementa o copie a tabelului actor, copie care detine structura, dar nu si datele de la nivelul tabelului model.
mysql> CREATE TEMPORARY TABLE actor_copy LIKE actor; Query OK, 0 rows affected
mysql> DESCRIBE actor_copy; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(45) | NO | | NULL | | | last_name | varchar(45) | NO | MUL | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+
mysql> SELECT * FROM actor_copy; Empty set
Copierea datelor de la nivelul tabelului model (actor) poate fi realizata printr-un INSERT … SELECT, care are in vedere colectarea datelor din tabelul actor si inserearea lor in tabelul actor_copy.
mysql> INSERT INTO actor_copy -> SELECT * FROM actor; Query OK, 201 rows affected Records: 201 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM actor_copy LIMIT 5; +----------+------------+--------------+---------------------+ | actor_id | first_name | last_name | last_update | +----------+------------+--------------+---------------------+ | 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 | | 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 | | 3 | ED | CHASE | 2006-02-15 04:34:33 | | 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 | | 5 | JOHNNY | LOLLOBRIGIDA | 2006-02-15 04:34:33 | +----------+------------+--------------+---------------------+
De asemenea, implementarea unui tabel se poate realiza si plecand de la rezultatul unei interogari. De exemplu, pe baza inregistrarilor din tabelul actor, poate fi creat un nou tabel care are o structura asemanatoare cu cea de la nivelul rezultatului interogarii.
mysql> CREATE TEMPORARY TABLE actor_copy AS SELECT * FROM actor; Query OK, 200 rows affected
mysql> DESCRIBE actor_copy; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | actor_id | smallint(5) unsigned | NO | | 0 | | | first_name | varchar(45) | NO | | NULL | | | last_name | varchar(45) | NO | | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+
Tabelul obtinut, actor_copy, detine si inregistrarile ce au fost colectate la nivelul interogarii pe baza careia s-a creat tabelul (SELECT * FROM actor).
mysql> SELECT * FROM actor_copy LIMIT 5; +----------+------------+--------------+---------------------+ | actor_id | first_name | last_name | last_update | +----------+------------+--------------+---------------------+ | 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 | | 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 | | 3 | ED | CHASE | 2006-02-15 04:34:33 | | 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 | | 5 | JOHNNY | LOLLOBRIGIDA | 2006-02-15 04:34:33 | +----------+------------+--------------+---------------------+