MySQL學習(二)-字段類型及約束

MySQL學習之二

如何選擇字段類型

  1. 儘可能精確,如身份證號碼,使用char(18),不使用varchar(18)
  2. 考慮應用語言的處理;將時間日期保存爲整型
  3. 考慮兼容性

列的屬性

NULL

  1. 是否爲空
    • 規定一個字段的值,是否能夠是null
    • NULL/NOT NULL
    • 默認值屬性:DEFAULT values, 在沒有設置該字段設置值啓動,一個字不能爲空,可使用默認值
  2. Examplemysql

    -- null/not null
    CREATE TABLE php_1(
        a INT NOT NULL,
        b INT
    );
    
    
    INSERT INTO php_1 (a) VALUES (10);
    
    -- 插入失敗,a 沒有默認值
    INSERT INTO php_1 (b) VALUES (11);
    
    -- Default values
    CREATE TABLE php_2(
        a INT NOT NULL DEFAULT 10,
        b INT NOT NULL DEFAULT 11
    );
    
    -- 在有默認值的狀況下,能夠插入單個字段的數值
    INSERT INTO php_2 (a) VALUES (10);
    INSERT INTO php_2 (b) VALUES (11);
    
    
    CREATE TABLE php_3(
        a INT NOT NULL DEFAULT 10,
        b INT DEFAULT 11
    );
    
    -- 若是有默認值,能夠插入NULL
    INSERT INTO php_3 VALUES(20, NULL)

主鍵PK

  1. 能夠惟一標識,某一記錄的字段或者字段的集合,就是主鍵
    • 單一主鍵,能夠是自身實體的屬性,可是最好自身不衝突,不屬於實體的任何屬性,做爲惟一標識,主鍵和業務邏輯不發生關係sql

    • 聯合主鍵數據庫

    • 主鍵不能爲空,衝突性能

    • 在定義字段,再定義主鍵,能夠將主鍵進行組合學習

    • 組合主鍵表示一個主鍵內有多個字段,mysql規定只能有一個主鍵優化

  2. 語法設計

    PRIMARY KEY
  3. Examplecode

    -- 主鍵的定義方式
    CREATE TABLE teacher(
        t_id INT PRIMARY KEY,
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED
    );
    
    -- 主鍵不能重複,不能爲空
    INSERT INTO teacher VALUES (1, 'Jack', '0331', 25);
    INSERT INTO teacher VALUES (1, 'Kevin', '0331', 25);
    INSERT INTO teacher VALUES (NULL, 'Kevin', '0331', 25);
    
    SELECT * FROM teacher t_id=1;
    
    -- 組合主鍵
    CREATE TABLE teacher2(
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED,
        PRIMARY KEY (t_name, class_name)
    );

自動增加

1.介紹排序

主要性質以下:

  • 爲每條記錄提供惟一的標識,每次插入記錄時,將某字段的值自動增長1,使用AUTO_INCREMENT標識

  • 須要整型,還須要索引

  • 插入數據,能夠插入null或者不插入

  • 自動增加的初始值,能夠設置; 若是n的值,小於已經存在的主鍵的值,該設置的值不起做用

  • 強制插入自動增加的值,是能夠的;若是是主鍵的,不能夠重複插入,若是不是主鍵,是能夠插入的;同時能夠更改

  • 問題:自動增加設置爲20,數據庫已經存在大於20的記錄,刪除全部大於20的記錄,插入數據時, ID爲多少?

  1. Example

    -- 自動增加
    
    CREATE TABLE teacher3(
        t_id INT PRIMARY KEY AUTO_INCREMENT,
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED
    );
    
    INSERT INTO teacher3 VALUES (null, 'emma', '0228', 34);
    INSERT INTO teacher3 (t_name, class_name, days) VALUES ('Jessica', '0231', 31);
    
    ALTER TABLE teacher3 AUTO_INCREMENT 10;
    INSERT INTO teacher3 (t_name, class_name, days) VALUES ('janice', '0231', 31);

    實體之間的關係

  2. 1:1 對應關係

    兩個實體表中,存在相同的主鍵字段即若是記錄的主鍵值等於另一個關係表內記錄的主鍵值,則這兩條關係是一一對應的

    優化方式:垂直分割的方式,有可能帶來數據的冗餘

  3. 1:n關係

    一個實體,對應多個其餘實體,例如:一個班級對應多個學生

    設計:在多的那端,增長一個字段,用於指向該實體所屬的另外實體標識。

  4. M: N關係

若是僅僅增長字段,在編輯的時候,容易比較難操做

設計:增長一箇中間表,來表示有關係的兩個表之間的關係

實體之間的約束-外鍵 Foreign Key

  1. 概念

若是一個實體(student)的某個字段(student:class_id),引用另外一個實體(class:class_id)的主鍵(class_id),稱做該實體的外鍵。

被指向的實體,稱之爲主實體,也叫父實體(父表)。
負責指向的實體,稱之爲從實體(從表),也叫子實體(子表)。

  1. 做用

用於約束關係內的實體
增長字表記錄時,是否有爲之對應的父表記錄。
在刪除或者更新主表記錄時,從表應該如何處理相關的記錄。

  1. 語法

    -- 在從表上,使用FOREIGN KEY關鍵字,建立字段,指向主表
    
    SET names gbk;
    
    DROP TABLE IF EXISTS gene_class;
    CREATE TABLE gene_class(
        class_id INT PRIMARY KEY AUTO_INCREMENT,
        class_name VARCHAR(10)  NOT NULL DEFAULT 'itcast_php' COMMENT 'class_name'
    ) CHARACTER SET utf8;
    
    
    DESC gene_class;
    
    DROP TABLE IF EXISTS itcast_student;
    CREATE TABLE itcast_student(
        stu_id INT PRIMARY KEY AUTO_INCREMENT,
        stu_name VARCHAR(10) NOT NULL DEFAULT '', 
        class_id INT, 
        FOREIGN KEY (class_id) REFERENCES gene_class (class_id)
    ) CHARACTER SET utf8;
    
    -- 沒有父表記錄,就不能建立字表的記錄
    INSERT INTO itcast_student VALUES (null, 'Gene', 1);
    
    INSERT INTO gene_class VALUES (null, 'php0331');
  2. 修改外鍵

  • 先刪除,再新建,經過修改表完成

    ALTER TABLE tb_name DROP FOREIGN KEY (字段名);

    刪除外鍵須要經過指定外鍵名稱達到目的;
    能夠經過在建立外鍵時候,指定名稱,
    或者使用mysql默認生成的名稱

    ALTER TABLE tb_name ADD FOREIGN KEY 外鍵定義;
  1. 設置級聯操做

在主表數據發生改變時候, 與之關聯的從表數據應該如何處理

  • 主表更新: ON UPDATE
    • 更新存在關聯的主鍵字段,是不能成功的
  • 主表刪除: ON DELETE
  • 容許的級聯操做
    • CASCADE 關聯操做,若是主表被更新或刪除,那麼從表也會執行相應的操做
    • SET NULL 設置NULL, 表示從表不指向任何主表記錄
    • RESTRICT 拒絕主表的操做
    -- 刪除外鍵
    ALTER TABLE itcast_student DROP FOREIGN KEY itcast_student_ibfk_1;
    
    -- 增長外鍵,在刪除主表的數據時,從表的相關的數據變成NULL
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE SET NULL;
    
    DELETE FROM gene_class WHERE class_id=1;
    
    
    -- 刪除外鍵
    INSERT INTO gene_class VALUES (null, 'php0331');
    ALTER TABLE itcast_student DROP FOREIGN KEY itcast_student_ibfk_1;
    
    -- CASCADE 增長外鍵,在刪除主表的數據時,從表的相關的數據也刪除
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE CASCADE;
    
    DELETE FROM gene_class WHERE class_id=2;
    
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE SET NULL ON UPDATE CASCADE;
  1. 外鍵

主要經過程序來控制,不要在數據庫中使用,除非你是DBA。

存儲引擎

1.簡介
表存儲的驅動, InnoDB存儲引擎支持外鍵,其餘的不支持外鍵,如BOB
默認的存儲引擎, 經過my.ini來控制

能夠配置:

```
DEFAULT-STORAGE-ENGINE=INNODB
```

在建立表,或者編輯表時,能夠指定表的存儲引擎

```
ENGINE 引擎類型
ENGINE myisam;
ENGINE innodb;
```
  1. 區別
    INNODB - 只生成一個文件,數據和索引放在INNODB指定的空間中,frm保存表結構
    myisam - 生成三個文件:frm結構、數據和索引

  2. 選擇存儲引擎的依據

  • 性能
  • 功能

ORDER BY

  1. 簡介

按照字段值進行排序;校對規則,決定排序關係
默認升序 ASC

```
ORDER BY 字段 ASC|DESC;
```

容許多字段排序,指的是,先按照第一個字段排序,若是說,不能區分,再使用第二個字段,仍是不行,使用第三個字段

```
SELECT * FROM teacher_class ORDER BY days DESC;
SELECT * FROM teacher_class ORDER BY days DESC, begin_date ORDER BY DESC, end_date ORDER BY DESC;
```

若是分組,應該使用分組字段進行排序:GROUP BY

相關文章
相關標籤/搜索