1. 程式人生 > >MySQL學習進階

MySQL學習進階

inf primary 文件 rom 主鍵約束 fault 文本文件 delet 介紹

存儲引擎

MyISAMMySQL 5.0 之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務 InnoDB事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成為默認數據庫引擎   ——MyISAM表中在插入式整個表被鎖定.InnoDB只鎖定該記錄.所有如果執行大量的update和insert,應該使用InnoDB;如果主要用來執行select,應該是MyISAM. BDB源 自 Berkeley DB,事務型數據庫的另一種選擇,支持Commit 和Rollback 等其他事務特性 Memory所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的內存空間。並且其內容會在 MySQL 重新啟動時丟失 Merge將一定數量的 MyISAM 表聯合而成一個整體,在超大規模數據存儲時很有用 Archive非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差 Federated將不同的 MySQL 服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分布式應用 Cluster/NDB高冗余的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用 CSV: 邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏為每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行占用一個文本行。CSV 存儲引擎不支持索引。 BlackHole:黑洞引擎,寫入的任何數據都會消失,一般用於記錄 binlog 做復制的中繼 EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL 源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發者。EXAMPLE 存儲引擎不支持編索引。

mysql數據類型

(1) 數值類型
技術分享

(2)字符串類型
技術分享

(3)日期和時間型
技術分享

sql語言

技術分享

約束

約束類型:主鍵默認值唯一外鍵非空
關鍵字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY

NOT NULL

主鍵(PRIMARY KEY)是用於約束表中的一行,作為這一行的標識符,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵要求這一行的數據不能有重復且不能為空。

還有一種特殊的主鍵——復合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識


默認值約束(DEFAULT)規定,當有DEFAULT約束的列,插入數據為空時該怎麽辦。

DEFAULT約束只會在使用INSERT語句(上一實驗介紹過)時體現出來,INSERT語句中,如果被DEFAULT約束的位置沒有值,那麽這個位置將會被DEFAULT的值填充


唯一約束(UNIQUE)比較簡單,它規定一張表中指定的一列的值必須不能有重復值,即這一列每個值都是唯一的。

當INSERT語句新插入的數據和已有數據重復的時候,如果有UNIQUE約束,則INSERT失敗.


外鍵(FOREIGN KEY)既能確保數據完整性,也能表現表之間的關系。

一個表可以有多個外鍵,每個外鍵必須REFERENCES(參考)另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。

在INSERT時,如果被外鍵約束的值沒有在參考列中有對應,比如以下命令,參考列(department表的dpt_name)中沒有dpt3,則INSERT失敗


非空約束(NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。

在MySQL中違反非空約束,不會報錯,只會有警告.

技術分享
CREATE DATABASE mysql_shiyan;

use mysql_shiyan;

CREATE TABLE department
(
  dpt_name   CHAR(20) NOT NULL,
  people_num INT(10) DEFAULT 10,
  CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)     ##約束名 dpt_pk 、主鍵約束
 );

CREATE TABLE employee
(
  id      INT(10) PRIMARY KEY,
  name    CHAR(20),
  age     INT(10),
  salary  INT(10) NOT NULL,
  phone   INT(12) NOT NULL,
  in_dpt  CHAR(20) NOT NULL,
  UNIQUE  (phone),
  CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)    ##外鍵約束
 );
 
CREATE TABLE project
(
  proj_num   INT(10) NOT NULL,
  proj_name  CHAR(20) NOT NULL,
  start_date DATE NOT NULL,
  end_date   DATE DEFAULT 2017-08-15,
  of_dpt     CHAR(20) REFERENCES department(dpt_name),
  CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
 );
示例

表的操作

1、創建表

CREATE TABLE 表名 (屬性名 數據類型 [完整性約束條件], 屬性名 數據類型 [完整性約束條件], 屬性名 數據類型 [完整性約束條件])

2、查看表結構

describe 表名

3、查看表結構

show create table 表名

show create table 表名 \G

4、修改表名

alter table 舊表名 rename [to] 新表名;

5、修改字段的數據類型

alter table 表名 modify 屬性名 數據類型;

6、修改字段名

alter table 表名 change 舊屬性名 新屬性名 [新數據類型];

7、增加字段

alter table 表名 add 屬性名1 數據類型 [完整性約束條件] [first] after 屬性名2;

8、刪除字段

alter table 表名 drop 屬性名;

9、刪除關聯表

(1)刪除表的外鍵約束
外鍵是一個特殊字段,其將某一個表與其父表建立關聯關系。在創建表的時候,外鍵約束就已經設定好了。去掉他們之間的關聯關系需要用到下面語句。

alter table 表名 drop foreign key 外鍵別名;

(2)刪除沒有被關聯的普通表 drop table 表名; (3)刪除被其他表關聯的父表

當刪除有關聯關系的表時,用drop table example1 會報錯,原因是有外鍵依賴於該表

例如創建了一個example4表依賴於example1表,example4表的外鍵stu_id依賴於example1表的主鍵。example1表時example4表的父表。

如果要刪除example4表,必須先去掉這種依賴關系。最簡單的辦法是先刪除子表example4,然後刪除父表example1。但這樣可能會影響子表的其他數據。

另一種方法是先刪除子表的外鍵約束,然後刪除父表。這種方法不會影響子表的其他數據,可以保證數據庫的安全。

比如,example4表的外鍵別名是d_fk,刪除example4的外鍵約束

alter table example4 drop foreign key d_fk;

可以通過show create table example4 \G來查看是否已刪除。
然後再執行 drop table example1;

執行成功則表示操作成功。

幫助

\h                       查看幫助

\s                       查看當前環境

\c                       廢棄當前輸入命令

創建用戶並授權

CREATE USER [email protected] IDENTIFIED BY ‘password‘;

GRANT {ALL | SELECT | INSERT | UPDATE } ON databasename.tablename TO [email protected]

工作中使用的示例:

技術分享
BEGIN
    
  DECLARE win_id VARCHAR(20);
    DECLARE win_count VARCHAR(20);

    SELECT id FROM windows_vps_log ORDER BY id DESC LIMIT 1 into win_id;
  SELECT count(id) FROM windows_vps_log into win_count;
    IF win_count>5000000 THEN
        delete from windows_vps_log where id <= win_id-3000000;
    END IF;
END
存儲過程 技術分享
SELECT
    machine_host,
    CONCAT(lan_ip, :, `port`) AS "問題機",
    dial_time
FROM
    client_info
WHERE
    mac IN (
        SELECT
            mac
        FROM
            windows_vps_log
        WHERE
            invalid = 0
        AND TIMESTAMPDIFF(MINUTE, create_time, now()) > 180
    )
ORDER BY
    machine_host desc
多表查詢

MySQL學習進階