1. 程式人生 > >MYSQL--儲存引擎、資料型別、約束條件、

MYSQL--儲存引擎、資料型別、約束條件、

儲存引擎:

    不同的資料應該有不同的處理機制

    mysql儲存引擎

        Innodb:預設的儲存引擎  查詢速度相比於myisam慢  但是更安全

        myisam:mysql老版本用的儲存引擎

        memory:記憶體引擎(資料全部存在記憶體中)

        blackhole:無論存什麼都立刻消失(黑洞)

    show engines;

 

資料型別:

    建立表的完整語法: 

create table 表名(
    欄位名1 型別[(寬度) 約束條件],
    欄位名2 型別[(寬度) 約束條件],
    欄位名3 型別[(寬度) 約束條件]
);

 

        注意:

            1、欄位名和欄位型別都是必須的  中括號內的引數都是可選的引數

            2、同一張表中欄位名不能重複

            3、最後一個欄位後面不能加括號

        寬度:(使用資料庫的準則:儘可能讓它少幹活)

            對儲存資料的限制

            char(1)  只能存一個字元如果超過了mysql會自動幫你擷取或者直接報錯(mysql中的嚴格模式)

            alter table tablename modify name char not null;    not null(該欄位不能為空)

        型別和中括號內的約束:

            型別約束的是資料的儲存型別

            而約束是基於型別之上的額外的限制

    欄位型別:

        

            

        整形: SMALLINT TINYINT INT BIGINT

=================有符號:預設有符號,即數字前有正負號===========
create table t1(id tinyint);
insert into t1 values(-128);  #插入成功
insert into t1 values(-129);  #插入失敗,5.7版本報錯:ERROR 1264 (22003): Out of range value for column 'id' at row 1。之前版本不會報錯,會將 -129 存成 -128
insert into t1 values(127);   #插入成功
insert into t1 values(128);   #插入失敗,5.7版本報錯。之前版本不會報錯,會將128存成127
===================無符號:範圍在 0~255======================
create table t2(id tinyint unsigned);
insert into t2 values(-1);   插入失敗,5.7之前版本會將 -1 存成 0。
其餘結果就不一一演示了。
===================zerofill測試整數型別的顯示寬度===============================
mysql> insert into zerofilltable values(1),(11),(111),(1111)
mysql> select * from zerofilltable;
+------+
| id   |
+------+
|  001 |
|  011 |
|  111 |
| 1111 |
+------+
4 rows in set (0.00 sec)

 

            TINYINT:預設是帶有符號的(-128,127),超出這個限制之後會存最大值或最小值

            create table tablename(id TINYINT);

        not null  不能為空

        unsigned  無正負符號

        zerofill 0填充多餘的位數

        char後面的數字是用來限制儲存資料的長度的

        特例:只有整型後面的數字不是用來限制儲存資料的長度的  而是用來控制展示資料的位數的

            int(8)  夠/超8位有幾位存幾位,不夠8位就用空格填充

        強調:對於整型來說,資料型別後的寬度並不是儲存限制,而是限時限制,所以在建立表的時候,如果欄位採用的是int型別,完全可以不指定限時寬度,預設的限時寬度,足夠顯示完整當初存放的資料

        模糊匹配:

            like

                %:匹配任意多個字元

                _:匹配任意一個字元

            set session 臨時有效  只在你當前操作的視窗有效

            set global全域性有效  終生有效

            設定完成之後,你需要重新退出再次登陸就OK了

            

    浮點型      

        float(255,30) 總共255位 小數部分佔30位
        double(255,30) 總共255位 小數部分佔30位
        decimal(65,30) 總共65位 小數部分佔30位

        create table t12(id FLOAT(255,30));
        create table t13(id DOUBLE(255,30));
        create table t14(id DECIMAL(65,30));

        精確度:float < double < decimal

    字元型別

        char(4):最大隻能存4個字元超出就會直接報錯  如果少了  會自動用空格填充 

        varchar(4):最大隻能存4個字元  超出就會直接報錯  如果少了  有幾個就存幾個

        create table t15(name char(4));
        create table t16(name varchar(4));

        char_length():

            msyq在儲存char型別欄位的時候  硬碟上確確實實存在的是固定長度的資料,但是在取出來的那一瞬間,mysql就會自動將填充的空格去除(可以通過嚴格模式,來修改該機制  讓其不做自動去處處理)

        char與varchar的區別:

            char取的時候方便直接按固定的長度取就可以

            varchar:取得時候比較繁瑣,無法是知道資料到底有多長

            char定長:

                1、浪費空間

                2、存取速度快

            varchar變長:

                1、節省空間

                2、存取速度慢(相對於char比較慢)

                    存的時候  需要先給資料一個記錄長度的報頭

                    取的時候   需要先讀取報頭才能讀取真是資料

            

    日期型別

mysql> create table t2(d date, t time, dt datetime);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t2 values(now(), now(), now());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from t2;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2019-08-19 | 23:32:13 | 2019-08-19 23:32:13 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
==============================================timestamp==================================
mysql> create table t3(timestamp_ timestamp);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t3 values(now());
Query OK, 1 row affected (0.01 sec)

mysql> select * from t3;
+---------------------+
| timestamp_          |
+---------------------+
| 2019-08-19 23:35:12 |
+---------------------+
1 row in set (0.00 sec)
==============================================year=======================================
mysql> insert into t1 values(now());
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+-----------+
| born_year |
+-----------+
|      2001 |
|      1990 |
|      2017 |
|      2019 |
+-----------+
4 rows in set (0.00 sec)
1. 單獨插入時間時,需要以字串的形式,按照對應的格式插入
2. 插入年份時,儘量使用4位值
3. 插入兩位年份時,<=69,以20開頭,比如50,  結果2050      
                >=70,以19開頭,比如71,結果1971
MariaDB [db1]> create table t12(y year);
MariaDB [db1]> insert into t12 values  
    -> (50),
    -> (71);
MariaDB [db1]> select * from t12;
+------+
| y    |
+------+
| 2050 |
| 1971 |
+------+

 

        date:年月日

        datetime:年月日時分秒

        year:年

        time:時分秒

    列舉和集合型別

        列舉:enum限制某個欄位能夠儲存的資料型別

mysql> create table shirts(
    -> name varchar(40),
    -> size enum('s', 'l', 'x', 'xxl'));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into shirts values('dress', 's'), ('youyiku', 'x');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from shirts;
+---------+------+
| name    | size |
+---------+------+
| dress   | s    |
| youyiku | x    |
+---------+------+
2 rows in set (0.00 sec)
=====================================只插入一個值====================================
mysql> insert into shirts(name) values('haha');
Query OK, 1 row affected (0.00 sec)
mysql> select * from shirts;
+---------+------+
| name    | size |
+---------+------+
| dress   | s    |
| youyiku | x    |
| haha    | NULL |
+---------+------+
3 rows in set (0.00 sec)
===========================列舉型別不一致會報錯=========================================
mysql> insert into shirts values('der', 'asd');
ERROR 1265 (01000): Data truncated for column 'size' at row 1

 

        集合:set限制某個欄位能夠儲存的資料內容

mysql> create table teacher(
    -> id int,
    -> name char(16),
    -> gender enum('male', 'female', 'others'),
    -> hobby set('pingpang', 'basketball', 'soccer'));
Query OK, 0 rows affected (0.02 sec)
=========================插入=========================
mysql> insert into teacher values(1, 'egon', 'male', 'soccer,pingpang');
Query OK, 1 row affected (0.00 sec)

注意:插入的時候,set多選的值之間不能有其他的東西,如多了個空格之類的神奇玩意;
========================查詢====================
mysql> select * from teacher;
+------+------+--------+-----------------+
| id   | name | gender | hobby           |
+------+------+--------+-----------------+
|    1 | NULL | female | soccer          |
|    1 | egon | male   | soccer          |
|    1 | egon | male   | pingpang,soccer |
+------+------+--------+-----------------+
3 rows in set (0.00 sec)

 

約束條件:

     not null:不能為空

    unique:唯一

        單列唯一:

            限時某一個欄位是唯一的

        聯合唯一:

            在語句的最後用括號的形式,表示哪幾個欄位組合的結果是唯一的

            

    default:給某個欄位設定預設值(當用戶寫了就用寫的,沒有的話就用預設的)

        create table t17(id int,name char(16) default 'william

    primary key:主鍵

        限制效果跟not null + unique 組合效果一致  非空且唯一

        create table t18(id int primary key);

        primary key也是innodb引擎查詢必備的索引,索引可以當成書的目錄

        innodb引擎在建立表的時候  必須要有一個主鍵,當你沒有指定主鍵的時候:

            1、會將非空且唯一的欄位自動升級為主鍵

            2、當你的表中沒有任何的約束條件的時候 innodb會採用自己的內部預設的一個主鍵欄位,該主鍵欄位你在查詢的時候是無法使用的,查詢資料的速度就會變得很慢,就好像是一頁一頁翻書

        通常每張表都應該有一個id欄位,並且應該將id設定為表的主鍵欄位

        聯合主鍵:多個欄位聯合起來作為表的一個主鍵, 本質還是一個主鍵!!!

              ps:innodb引擎中一張表有且只有一個主鍵

         auto_increment:自動遞增

 

delete from :僅僅是刪除資料沒  不會重置主鍵

 truncate:初始化表  會重置主鍵

&n