Arxiv

Archive for İ

TIMESTAMP data type

TIMESTAMP columnlar-ı da DATETİME kimi görsədilir.Yəni ki 19 simvol uzunluğu var və “YYYY-MM-DD HH:MM:SS” formatındadır.

Lakin DATETİME-dan fərqli olaraq bir çox əhəmiyyətli xüsusiyyətləri vardır ki, indi onlar haqqında danışacıq.
Qısa olaraq desək auto-initialization və auto-update xüsusiyyətləri.Bu əsasən LOG table-larda gördüyümüz bir şeydir.Tapşırıqlar şəklində yazaq:
1)
Bizə lazımdır ki, TIME_LOG1 cədvəli ona daxil edilən hər məlumatın daxil edildiyi vaxtı qeydə alsın. (auto-initialization)
Bunun üçün DEFAULT CURRENT_TIMESTAMP -dən istifadə edəcik.

CREATE TABLE TIME_LOG1(
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
name VARCHAR(10)
);

Və davamı ilə insert versək:

INSERT INTO time_log1(name) VALUES('Orxan');

…müəyyən vaxtdan sonra ikinci insert:

INSERT INTO time_log1(name) VALUES('Ehmed');

İndi isə nəticəyə baxaq:

SELECT *
FROM time_log1;

blog_picture1

2)
Bizə lazımdır ki, time_log2 cədvəli yalnız edilmiş dəyişikliklərin vaxtını qeyd etsin. (auto-update)
Bunun üçün biz ON UPDATE CURRENT_TIMESTAMP-dən istifadə edəcik

CREATE TABLE time_log2(
update_time TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
name VARCHAR(10)
);

insert verək:

INSERT INTO time_log2(name) VALUES('Samed');

daha sonra:

SELECT *
FROM time_log2;

blog_picture2

Gördüyümüz kimi bu zaman initiliozation vaxtı qeydə alınmır.
Lakin update verdikdə bu qeydə alınır(yəni dəyişiklik edildikdə)

UPDATE time_log2 SET name='Rafiq';

blog_picture3

3)
Lakin daha məntiqli belə olardı ki, bir column initiliozation-u digəri isə update-i qeyd etsin.(auto-initiliozation and auto-update)

CREATE TABLE time_log3(
create_time TIMESTAMP DEFAULT 0,
update_time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
name VARCHAR(10)
);
INSERT INTO time_log3(create_time,name) VALUES(NULL,'Shahriyar');

blog_picture4

UPDATE time_log3 SET name='Xetai';

blog_picture5

Bundan əlavə onu demək lazımdır ki, TİMESTAMP column default olaraq:
NOT NULL və DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP-dir.
Yəni ki,

CREATE TABLE test1(
ts TIMESTAMP,
name VARCHAR(25)
);

CREATE TABLE test1 (
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
name VARCHAR(25) NULL DEFAULT NULL
);

ikisi də eyni şeydir.
Əgər istəsək TİMESTAMP column null qəbul etsin onda explicit olaraq bunu qeyd etməliyik:

CREATE TABLE ts_null(
ts1 TIMESTAMP NULL,
name VARCHAR(25)
);
INSERT INTO ts_null(name) VALUES('Reshad');
SELECT * FROM ts_null;

blog_picture6

DEFAULT 0 kimi definition-lar ola bilsin ki işləməsin.
Bunun səbəbi NO_ZERO_DATE SQL mode-un aktiv olunmasıdır. Bu mode TRADİTİONAL SQL mode-un daxilində default olaraq gəlir.
NO_ZERO_DATE SQL mode-u 0, ‘0000-00-00′,’0000-00-00 00:00:00’ kimi məlumatları qəbul etmir.
Məsələn,

set @@global.sql_mode=traditional; 
CREATE TABLE ts_2(
ts TIMESTAMP DEFAULT 0,
name VARCHAR(25)
);

blog_picture7

SQL mode-lar haqqında ətraflı məlumat MySQL-də SQL_MODE əhəmiyyəti

TIMESTAMP və DATETİME haqqında isə.
1. The DATE, DATETIME, and TIMESTAMP Types
2. TIMESTAMP Properties

Kateqoriyalar: MySQL Etiketlər: , , , ,

MySQL-də SQL_MODE əhəmiyyəti

MySQL-in bir çox xarakteristikalarını SQL_MODE vasitəsilə dəyişmək mümkündür. Bu xüsusən database üçün düzgün input qaydalarını müəyyən etmək üçün əhəmiyyətlidir.
Məsələn default olaraq MySQL “division by zero” (0-a bölmə) olduqda NULL daxil edir. Lakin təbii ki , bizə bu zaman ERROR verməsi daha çox sərf edər.
Və.s bu kimi xüsusiyyətləri SQL_MODE ilə idarə etmək olar.
İlk öncə default SQL_MODE-un nə olduğunu öyrənək:

select @@sql_mode;

default sql_mode

CREATE TABLE t2 (
id INT(11),
name VARCHAR(4)
);

Və insert etdikdə STRICT_TRANS_TABLES-ın əməlləri olaraq ERROR alırıq.Çox sağolsun 🙂
Bu mode aktiv edildikdə əmin ola bilərik ki, “out of range” məlumat daxil edilməyəcək.

mysql> insert into t2 values(15,'Besiktas');
ERROR 1406 (22001): Data too long for column 'name' at row 1

NO_AUTO_CREATE_USER—bu da çox əhəmiyyətli bir mode-dur.
Deyək ki siz bilmədən mövcud olmayan bir user-ə GRANT verirsiz. Əgər bu mode aktiv deyilsə, GRANT icazəsiz olaraq yeni bir user yaradacaq. Bu mode aktiv olsa, ERROR çıxar və bunun qarşısını alacaq.
Göstərmək məqsədilə SQL_MODE-u dəyişək.

set @@global.sql_mode=ANSI;

Reconnect olaq və

select @@sql_mode;

Gördüyümüz kimi NO_AUTO_CREATE_USER mode-u burda yoxdur. Bu səbəbdəndir ki,

GRANT SELECT ON tr_blog.military TO 'jeffrey'@'localhost'; 

komandası işləyəcək və həqiqətən də yeni user yaradılacaq.

select user from mysql.user;

NO_ENGINE_SUBSTITUTION— deyək ki biz elə bir table yaratmaq istəyirik ki, hər hansı dəstəklənməyən storage engine-dan istifadə etsin (məsələn NDB). Təbii ki , əgər bu mode aktiv olmasa default engine istifadə olunacaq amma məncə ERROR çıxsa daha gözəl olar 🙂

create table t3 (id int) engine=NDB;

STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION— bu 3 mode default olaraq MySQL installation-da yer alır.
Lakin bəzən bu default hallar bizə bəs etmir. Məsələn default olaraq “division by zero” əməliyyatı zamanı NULL insert və ya update olunur(mövzunun əvvəlində qeyd olunduğu kimi).

CREATE TABLE t1 (
id INT not null
);
insert into t1 values(1/0);

Adətən isə bizə bu sərf etmir. Yəni programlaşdırmadan belə görmüşük ki bu zaman ERROR çıxmalıdır özü də dəhşət məşhur bir ERROR 🙂
Və MySQL-in dəstəklədiyi ən ciddi mode “TRADİTİONAL”-dır ki, bu indiki halda bizə lazım olandır.

mysql> set @@session.sql_mode=traditional;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.sql_mode\G
*************************** 1. row ***************************
@@session.sql_mode: STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

İndi isə yenidən insert verək:

insert into t1 values(1/0);

Və sevimli ERROR-umuz bu zaman gəlir 🙂
TRADİTİONAL mode bizə Bir çox əlavə restriction-lar verir. Daha ətraflı documentation-dan oxumaq olar.

MySQL Server SQL Modes

Kateqoriyalar: MySQL Etiketlər: , ,

TRUNCATE TABLE və DELETE FROM TABLE

TRUNCATE TABLE və DELETE TABLE haqqında maraqlı bir məlumat oxudum və dərhal da yazıram 🙂
Qayda olaraq belədir ki, əgər bir table-ı tamamilə silmək istəyiriksə, TRUNCATE TABLE-dan istifadə etmək lazımdır. AUTO_İNCREMENT-in saygaci bu halda 0-lanır. DELETE FROM TABLE-da isə bu belə olmurmuş.

1.

CREATE DATABASE music;

2.

USE music;

3.

CREATE TABLE composer (id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(15),
lastname VARCHAR(25), PRIMARY KEY (id)
);

Cədvəlimizi yaratdıqdan sonra ora 3 yazı əlavə edək:
4.

INSERT INTO composer (name,lastname) VALUES('Fikret','Emirov');

INSERT INTO composer (name,lastname) VALUES('Emin','Sabitoglu');

INSERT INTO composer (name,lastname) VALUES('Xanim','Ismayilqizi');

Və select edək:
5.

SELECT *
FROM composer;

blog_picture_1

Daha sonra delete verək:
6.

DELETE
FROM composer;

blog_picture_2

İndi isə yenidən insert edək:
7.

INSERT INTO composer (name,lastname) VALUES('Fikret','Emirov');

INSERT INTO composer (name,lastname) VALUES('Emin','Sabitoglu');

INSERT INTO composer (name,lastname) VALUES('Xanim','Ismayilqizi');

8.

SELECT *
FROM composer;

blog_picture_3

İD-lərə fikir versək 4,5,6 olaraq görəcik ki, bu da o deməkdir ki AUTO_İNCREMENT-in sayğacı DELETE FROM TABLE 0-lanmır.

İndi isə cədvəli silək, yenidən yaradaq və insert verək.

9.

DROP TABLE composer;

10.

CREATE TABLE composer (id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(15),
lastname VARCHAR(25), PRIMARY KEY (id)
);

11.

INSERT INTO composer (name,lastname) VALUES('Fikret','Emirov');

INSERT INTO composer (name,lastname) VALUES('Emin','Sabitoglu');

INSERT INTO composer (name,lastname) VALUES('Xanim','Ismayilqizi');

12.

TRUNCATE TABLE composer;

blog_picture_4

Və yenidən insert versək:

blog_picture_5

Gördüyümüz kimi TRUNCATE TABLE zamanı AUTO_İNCREMENT 0-lanır 🙂
Təşəkkürlər 🙂

Kateqoriyalar: MySQL Etiketlər: , , ,