Arxiv

Posts Tagged ‘data type’

MySQL data tiplərində default qiymətlər

Bu gün bir şeyə fikir vermişəm, təsadüfən. və istədim bölüşüm…
Demək 1 table yaradaq və definition-larda NOT NULL qeyd edək:

create table not_null_test (
    id int not null,
    user_name varchar(10) not null
);

DESC verdikdə görün nə çıxır:

mysql> desc not_null_test;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | int(11)     | NO   |     | NULL    |       |
| user_name | varchar(10) | NO   |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Definition-da NOT NULL qeyd etdiyim halda default NULL yazılır 😛
İnsert verib yoxlasaq :

mysql> insert into not_null_test() values();
Query OK, 1 row affected, 2 warnings (0.04 sec)

2 warnings var onlara da baxsaq:

mysql> show warnings;
+---------+------+------------------------------------------------+
| Level   | Code | Message                                        |
+---------+------+------------------------------------------------+
| Warning | 1364 | Field 'id' doesn't have a default value        |
| Warning | 1364 | Field 'user_name' doesn't have a default value |
+---------+------+------------------------------------------------+
2 rows in set (0.00 sec)

Halbuki DESC-de default value NULL qeyd olunub 🙂
Select-də:

mysql> select * from not_null_test;
+----+-----------+
| id | user_name |
+----+-----------+
|  0 |           |
+----+-----------+
1 row in set (0.00 sec)

Deməli burda Default : NULL yazısı bizi aldatmamalıdır…Burdakı NULL datatype-ın default qiymətini göstərir. Yəni əgər int və varchar NULL-able (NULL qəbul etsə) onların default qiyməti NULL olacaq…
Lakin indiki halda definition NOT NULL olduğu üçün Default qiymət int not null üçün=0, varchar not null üçün isə=’ ‘….

İndi isə 2ci table:

create table not_null_test3 (
    id int,
    user_name varchar(10)
);

DESC verdikdə:

mysql> desc not_null_test3;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | int(11)     | YES  |     | NULL    |       |
| user_name | varchar(10) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

İnsert Və Select:

mysql> insert into not_null_test3() values();
Query OK, 1 row affected (0.11 sec)

mysql> select * from not_null_test3;
+------+-----------+
| id   | user_name |
+------+-----------+
| NULL | NULL      |
+------+-----------+
1 row in set (0.00 sec)

İndi isə ümumiləşdirək və tərif verək:
Əgər İnt və Varchar tipləri NULL qəbul edirsə onların implicit default qiymətləri NULL olacaq.
Əgər İnt və Varchar tipləri NOT NULL-durlarsa o zaman default implicit qiymətlər İnt=0 və Varchar=’ ‘

Digər data tipləri, daha dəqiq desək Timestamp data tipi(və DATE tipləri) haqqında oxumaq üçün:
Timestamp data type

Təşəkkürlər 🙂

Advertisements
Kateqoriyalar: MySQL Etiketlər: , , , ,

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: , , , ,

ENUM and SET data types

ENUM və SET-i oxuyarkən xoşuma gəldi. Maraqlı gəldi deyə bilərik hətta 🙂
Dərhal işə qoyulsaq və bir table yaratsaq:

create table employees (
name varchar(25),
occupation ENUM ('President','Sales Manager','System Adminstrator')
);

Və dərhal bir insert etsək:

insert into employees (name,occupation) values('Shahriyar','President');

Hər şey uğurla gedir və output:
Output of query

indi isə sorğunu biraz dəyişək və:

insert into employees (name,occupation) values('Ehmed','Finance');

Output isə dəhşətlidir 🙂 :
Query output

Səbəb-Çünki “Finance” yazısı table-ı yaradarkən ENUM listin içində deyildir. Yəni insert edərkən yalniz ‘President’,’Sales Manager’,’System Adminstrator’-a icazə var. Eyni error :

insert into employees (name,occupation) values('Ehmed','');

Yazarkən de çıxır. Yəni ENUM sütununa ne səhv məlumat, nə də ki boş (NULL) məlumat daxil etmək mümkün deyil.

ENUM haqqında digər maraqlı bir şey isə-“ENUM sütun definition gördüyünüz kimi string-lərlər verilir.Ancaq daxilen MySQL bu məlumatları integer olaraq saxlayır. Yəni, ‘President’=1 ‘Sales Manager’=2 ‘System Adminstrator’=3 “.
Bu məlumatı yadda saxlayırıq və yeni bir table yaradırıq:

create table age_list(
age int,
list_of ENUM('0','1','2','3','4')
);

Yuxarıda dediyimiz tərifə əsasən nəticə çıxardırıq ki: ‘0’=1, ‘1’=2, ‘2’=3, ‘3’=4, ‘4’=5.
indi isə 1ci insert-imizi edək:

insert into age_list (age,list_of) values (18,'3');

Output bizim gözlədiyimiz kimidir:
output
Və super ikinci insert-imiz:

insert into age_list (age,list_of) values (18,3);

Output bizim gözlədiyimiz kimi deyil malesef 🙂 :
output

Məncə anlaşıldı nəyə görə belə olduğu 🙂

O ki qaldı SET-ə onda biraz sadəlik hökm sürür.
Bir table yaradaq:

create table show_xestelik(
xestelikler SET('olumcul','yungulvari','orta-agir')
);

Gülməyə ehtiyac var ağlıma indiki halda ancaq bu gəldi 🙂
Daha sonra 3 ədəd insert verək:

insert into show_xestelik (xestelikler) values('');
insert into show_xestelik (xestelikler) values('olumcul');
insert into show_xestelik (xestelikler) values('yungulvari,orta-agir');

SET-də boş(NULL) məlumat daxil etmək olurmuş. Sübutumuz:
set output

Boş məlumatın yeri görsənir 😉 Lakin SET-də də list-də olmayan məlumat daxil edildikdə ENUM-dakı kimi error verir.
Təşəkkürlər.

Kateqoriyalar: MySQL Etiketlər: , , ,