數據庫基礎二

存儲引擎

  1. InnoDB 支持事務,外鍵,行級鎖
    事務:一個最小的不可再分的工做單元;一般一個事務對應一個完整的業務

 

事務四大特性:
1.原子性(A):事務是最小單位,不可再分
2.一致性(C):事務要求全部的DML語句操做的時候,   必須保證同時成功或者同時失敗
3.隔離性(I):事務A和事務B之間具備隔離性
4.持久性(D):是事務的保證,事務終結的標誌(內存的數據持久到硬盤文件中)

 

關於事務的一些術語
開啓事務:Start Transaction
事務結束:End Transaction
提交事務:Commit Transaction
回滾事務:Rollback Transaction
  1. MyIsam 表級鎖,支持全文索引
    只查詢多,修改少的時候使用
    myisam,同一張表中的數據不能被同時修改python

  2. memory 每一個用戶的登陸狀態
    數據都存在內存中,讀取速度快
    數據量小 並對服務器的內存有要求
    斷電消失mysql

  3. blackhole 黑洞
    放進去的全部數據都不存linux

 

sql語句

  1. 建立表

 

mysql> create table staff_info (id int,
       name varchar(20),
       age int,
       sex enum('female','male'),
       phone char(11),
       job varchar(20));
Query OK, 0 rows affected (0.20 sec)
  1. 查看錶結構
    mysql> desc staff_info;

 

+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | YES  |     | NULL    |       |
| age   | int(11)               | YES  |     | NULL    |       |
| sex   | enum('female','male') | YES  |     | NULL    |       |
| phone | char(11)              | YES  |     | NULL    |       |
| job   | varchar(20)           | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
  1. 插入數據

 

指定列名插入數據
mysql> insert into staff_info (id,name,age,sex,phone,job) values (1,'aa',83,'female','13651054608','IT');
Query OK, 1 row affected (0.02 sec)

插入單行數據
mysql> insert into staff_info values (2,'xm',82,'female','13651054608','IT');
Query OK, 1 row affected (0.02 sec)

插入多行數據
 mysql> insert into staff_info values
     -> (2,'ww',26,'male','13304320533','Tearcher'),
     -> (3,'ls',25,'male','13332353222','IT'),
     -> (4,'zs',40,'male','13332353333','IT');
  1. 查詢數據

 

# 查看全部列的數據
# mysql> select * from staff_info;
# +------+----------+------+--------+-------------+----------+
# | id   | name     | age  | sex    | phone       | job      |
# +------+----------+------+--------+-------------+----------+
# |    1 | xm     |   82 | female | 13651054608 | IT       |
# |    2 | ww     |   26 | male   | 13304320533 | Tearcher |
# |    3 | ls     |   25 | male   | 13332353222 | IT       |
# |    4 | zs     |   40 | male   | 13332353333 | IT       |
# +------+----------+------+--------+-------------+----------+
  1. 查看指定列的數據

 

# mysql> select name,age from staff_info;
# +----------+------+
# | name     | age  |
# +----------+------+
# | xm     |   82 |
# | ww     |   26 |
# | ls    |   25 |
# | zs |   40 |
# +----------+------+
# 4 rows in set (0.00 sec)

 

數據類型

經常使用
int
float
decimal
  1. 整數部分

 

# mysql> create table t5 (id1 int(4),id2 int);
# Query OK, 0 rows affected (0.16 sec)
#
# mysql> desc t5;
# +-------+---------+------+-----+---------+-------+
# | Field | Type    | Null | Key | Default | Extra |
# +-------+---------+------+-----+---------+-------+
# | id1   | int(4)  | YES  |     | NULL    |       |
# | id2   | int(11) | YES  |     | NULL    |       |
# +-------+---------+------+-----+---------+-------+
# 2 rows in set (0.01 sec)
#
# mysql> insert into t5 values (123,123);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t5;
# +------+------+
# | id1  | id2  |
# +------+------+
# |  123 |  123 |
# +------+------+
# 1 row in set (0.00 sec)

# mysql> insert into t5 values (12345,12345);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t5;
# +-------+-------+
# | id1   | id2   |
# +-------+-------+
# |   123 |   123 |
# | 12345 | 12345 |
# +-------+-------+
# 2 rows in set (0.00 sec)
#
# mysql> insert into t5 values (123,2147483648);
# Query OK, 1 row affected, 1 warning (0.02 sec)
#
# mysql> select * from t5;
# +-------+------------+
# | id1   | id2        |
# +-------+------------+
# |   123 |        123 |
# | 12345 |      12345 |
# |   123 | 2147483647 |
# +-------+------------+
# 3 rows in set (0.00 sec)

# 範圍測試 有符號和無符號
# mysql> create table t6 (id1 int(4),id2 int unsigned);
# Query OK, 0 rows affected (0.25 sec)
#
# mysql> insert into t6 values (123,2147483648);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t6;
# +------+------------+
# | id1  | id2        |
# +------+------------+
# |  123 | 2147483648 |
# +------+------------+
# 1 row in set (0.00 sec)
  1. 小數

 

# 長度約束測試
# mysql> create table t7 (f float(10,3),d double(10,3),d2 decimal(10,3));
# Query OK, 0 rows affected (0.20 sec)
#
# mysql> insert into t7 values (1.23456789,2.34567,3.56789);
# Query OK, 1 row affected, 1 warning (0.02 sec)
#
# mysql> select * from t7;
# +-------+-------+-------+
# | f     | d     | d2    |
# +-------+-------+-------+
# | 1.235 | 2.346 | 3.568 |
# +-------+-------+-------+
# 1 row in set (0.00 sec)
  1. 精度測試

 

# mysql> create table t8 (f float(255,30),d double(255,30),d2 decimal(65,30));
# Query OK, 0 rows affected (0.18 sec)
# mysql> insert into t8 values (1.11111111111111111111111111111111111111111111111111111111111,1.11111111111111111111111111111111111111111111111111111111111,1.11111111111111111111111111111111111111111111111111111111111);
# Query OK, 1 row affected, 1 warning (0.02 sec)
# mysql> select * from t8;
# +----------------------------------+----------------------------------+----------------------------------+
# | f                                | d                                | d2                               |
# +----------------------------------+----------------------------------+----------------------------------+
# | 1.111111164093017600000000000000 | 1.111111111111111200000000000000 | 1.111111111111111111111111111111 |
# +----------------------------------+----------------------------------+----------------------------------+

 

時間類型

經常使用
date      描述年月日
datetime  描述年月日時分秒
  1. timestamp字段默認不爲空

 

# mysql> create table t9 (d date,t time,y year,dt datetime,ts timestamp);
# Query OK, 0 rows affected (0.18 sec)
#
# mysql> desc t9;
# +-------+-----------+------+-----+-------------------+-----------------------------+
# | Field | Type      | Null | Key | Default           | Extra                       |
# +-------+-----------+------+-----+-------------------+-----------------------------+
# | d     | date      | YES  |     | NULL              |                             |
# | t     | time      | YES  |     | NULL              |                             |
# | y     | year(4)   | YES  |     | NULL              |                             |
# | dt    | datetime  | YES  |     | NULL              |                             |
# | ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
# +-------+-----------+------+-----+-------------------+-----------------------------+
# 5 rows in set (0.01 sec)
#
# mysql> insert into t9 values (null,null,null,null,null);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t9;
# +------+------+------+------+---------------------+
# | d    | t    | y    | dt   | ts                  |
# +------+------+------+------+---------------------+
# | NULL | NULL | NULL | NULL | 2018-09-29 11:27:29 |
# +------+------+------+------+---------------------+
# 1 row in set (0.00 sec)
#
# mysql> insert into t9 values(now(),now(),now(),now(),now());
# Query OK, 1 row affected, 1 warning (0.03 sec)
  1. 每種數據類型表示的時間格式

 

# mysql> select * from t9;
# +------------+----------+------+---------------------+---------------------+
# | d          | t        | y    | dt                  | ts                  |
# +------------+----------+------+---------------------+---------------------+
# | NULL       | NULL     | NULL | NULL                | 2018-09-29 11:27:29 |
# | 2018-09-29 | 11:29:07 | 2018 | 2018-09-29 11:29:07 | 2018-09-29 11:29:07 |
# +------------+----------+------+---------------------+---------------------+
# 2 rows in set (0.00 sec)
#
  1. datetime 和 timestamp的範圍控制

 

# mysql> insert into t9 (dt) values (10010101000000);
# Query OK, 1 row affected (0.03 sec)

# mysql> select * from t9;
# +------------+----------+------+---------------------+---------------------+
# | d          | t        | y    | dt                  | ts                  |
# +------------+----------+------+---------------------+---------------------+
# | NULL       | NULL     | NULL | NULL                | 2018-09-29 11:27:29 |
# | 2018-09-29 | 11:29:07 | 2018 | 2018-09-29 11:29:07 | 2018-09-29 11:29:07 |
# | NULL       | NULL     | NULL | 1001-01-01 00:00:00 | 2018-09-29 11:30:33 |
# +------------+----------+------+---------------------+---------------------+
# 3 rows in set (0.00 sec)

# mysql>
# mysql> insert into t9 (ts) values (10010101000000);
# Query OK, 1 row affected, 1 warning (0.03 sec)
#
# mysql> select * from t9;
# +------------+----------+------+---------------------+---------------------+
# | d          | t        | y    | dt                  | ts                  |
# +------------+----------+------+---------------------+---------------------+
# | NULL       | NULL     | NULL | NULL                | 2018-09-29 11:27:29 |
# | 2018-09-29 | 11:29:07 | 2018 | 2018-09-29 11:29:07 | 2018-09-29 11:29:07 |
# | NULL       | NULL     | NULL | 1001-01-01 00:00:00 | 2018-09-29 11:30:33 |
# | NULL       | NULL     | NULL | NULL                | 0000-00-00 00:00:00 |
# +------------+----------+------+---------------------+---------------------+
# 4 rows in set (0.00 sec)

 

字符串類型

CHAR	0-255字節	定長字符串
    # 定長 浪費磁盤 存取速度很是快
VARCHAR	0-65535 字節	變長字符串
    # 變長 節省磁盤空間 存取速度相對慢

char(5)     '  abc'  5   'abcde'  5
    # 這一列數據的長度變化小  手機號 身份證號 學號
    # 頻繁存取、對效率要求高
    # 短數據
varchar(5)  '3abc'   4   '5abcde' 6
    # 這一列的數據長度變化大  name  描述信息
    # 對效率要求相對小
    # 相對長

 

# mysql> create table t10 (c char(5),vc varchar(5));
# Query OK, 0 rows affected (0.14 sec)
#
# mysql> desc t10;
# +-------+------------+------+-----+---------+-------+
# | Field | Type       | Null | Key | Default | Extra |
# +-------+------------+------+-----+---------+-------+
# | c     | char(5)    | YES  |     | NULL    |       |
# | vc    | varchar(5) | YES  |     | NULL    |       |
# +-------+------------+------+-----+---------+-------+
# 2 rows in set (0.01 sec)

 

# 插入ab,實際上存儲中c佔用5個字節,vc只佔用3個字節,可是咱們查詢的額時候感知不到
# 由於char類型在查詢的時候會默認去掉全部補全的空格
# mysql> insert into t10 values ('ab','ab');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t10;
# +------+------+
# | c    | vc   |
# +------+------+
# | ab   | ab   |
# +------+------+
# 1 row in set (0.00 sec)

 

# 插入的數據超過了約束的範圍,會截斷數據
# mysql> insert into t10 values ('abcdef','abcdef');
# Query OK, 1 row affected, 2 warnings (0.02 sec)
#
# mysql> select * from t10;
# +-------+-------+
# | c     | vc    |
# +-------+-------+
# | ab    | ab    |
# | abcde | abcde |
# +-------+-------+
# 2 rows in set (0.00 sec)

 

# 插入帶有空格的數據,查詢的時候能看到varchar字段是帶空格顯示的,char字段仍然在顯示的時候去掉了空格
# mysql> insert into t10 values ('ab    ','ab    ');
# Query OK, 1 row affected, 1 warning (0.03 sec)
#
# mysql> select * from t10;
# +-------+-------+
# | c     | vc    |
# +-------+-------+
# | ab    | ab    |
# | abcde | abcde |
# | ab    | ab    |
# +-------+-------+
# 3 rows in set (0.00 sec)
#
# mysql> select concat(c,'+'),concat(vc,'+') from t10;
# +---------------+----------------+
# | concat(c,'+') | concat(vc,'+') |
# +---------------+----------------+
# | ab+           | ab+            |
# | abcde+        | abcde+         |
# | ab+           | ab   +         |
# +---------------+----------------+
# 3 rows in set (0.01 sec)

 

枚舉和集合類型

枚舉 enum   單選
集合 set    多選

 

# mysql> create table t11 (name varchar(20),sex enum('male','female'),hobby set('抽菸','喝酒','燙頭','翻車'));
# Query OK, 0 rows affected (0.15 sec)
#
# mysql> desc t11;
# +-------+------------------------------------------+------+-----+---------+-------+
# | Field | Type                                     | Null | Key | Default | Extra |
# +-------+------------------------------------------+------+-----+---------+-------+
# | name  | varchar(20)                              | YES  |     | NULL    |       |
# | sex   | enum('male','female')                    | YES  |     | NULL    |       |
# | hobby | set('抽菸','喝酒','燙頭','翻車')         | YES  |     | NULL    |       |
# +-------+------------------------------------------+------+-----+---------+-------+
# 3 rows in set (0.01 sec)

 

# 若是插入的數據不在枚舉或者集合範圍內,數據沒法插入表
# mysql> insert into t11 values ('alex','aaaa','bbbb');
# Query OK, 1 row affected, 2 warnings (0.02 sec)
#
# mysql> select * from t11;
# +------+------+-------+
# | name | sex  | hobby |
# +------+------+-------+
# | alex |      |       |
# +------+------+-------+
# 1 row in set (0.00 sec)

 

# 向集合中插入數據,自動去重
# mysql> insert into t11 values ('alex','female','抽菸,抽菸,燙頭');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t11;
# +------+--------+---------------+
# | name | sex    | hobby         |
# +------+--------+---------------+
# | alex |        |               |
# | alex | female | 抽菸,燙頭     |
# +------+--------+---------------+
# 2 rows in set (0.00 sec)

 

# 向集合中插入多條數據,不存在的項沒法插入
# mysql> insert into t11 values ('alex','female','抽菸,抽菸,燙頭,打豆豆');
# Query OK, 1 row affected, 1 warning (0.03 sec)
#
# mysql> select * from t11;
# +------+--------+---------------+
# | name | sex    | hobby         |
# +------+--------+---------------+
# | alex |        |               |
# | alex | female | 抽菸,燙頭     |
# | alex | female | 抽菸,燙頭     |
# +------+--------+---------------+
# 3 rows in set (0.00 sec)

 

完整性約束

not null      非空
unique        惟一 : 惟一能夠有一個空
惟一 + 非空
primary key   主鍵  惟一+非空 加速查詢 每張表只能有一個主鍵
foreign key   外鍵  Innodb

 

# primary key
    # 惟一+非空 每張表只能有一個主鍵
# not null      非空
# unique        惟一 : 惟一能夠有一個空

# not null + 惟一
    # 有一個能夠爲空了

 

# mysql> create table t12 (id int primary key,name varchar(20) not null,phone char(11) not null unique);
# Query OK, 0 rows affected (0.20 sec)
#
# mysql> desc t12;
# +-------+-------------+------+-----+---------+-------+
# | Field | Type        | Null | Key | Default | Extra |
# +-------+-------------+------+-----+---------+-------+
# | id    | int(11)     | NO   | PRI | NULL    |       |
# | name  | varchar(20) | NO   |     | NULL    |       |
# | phone | char(11)    | NO   | UNI | NULL    |       |
# +-------+-------------+------+-----+---------+-------+
# 3 rows in set (0.01 sec)
#
# mysql> insert into t12 (id,name) values (1,'alex');
# Query OK, 1 row affected, 1 warning (0.03 sec)
#
# mysql> select * from t12;
# +----+------+-------+
# | id | name | phone |
# +----+------+-------+
# |  1 | alex |       |
# +----+------+-------+
# 1 row in set (0.00 sec)
#
# mysql> insert into t12 (id,name) values (2,'egon');
# ERROR 1062 (23000): Duplicate entry '' for key 'phone'
# mysql> insert into t12 (id,name,phone) values (2,'egon','13434345678');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t12;
# +----+------+-------------+
# | id | name | phone       |
# +----+------+-------------+
# |  1 | alex |             |
# |  2 | egon | 13434345678 |
# +----+------+-------------+
# 2 rows in set (0.00 sec)

 

# 不能輸入重複的值
# mysql> insert into t12 (name,phone) values ('egon','13434345678');
# ERROR 1062 (23000): Duplicate entry '13434345678' for key 'phone'
# mysql> insert into t12 (name,phone) values ('egon','13434345679');
# Query OK, 1 row affected, 1 warning (0.02 sec)

# mysql> select * from t12;
# +----+------+-------------+
# | id | name | phone       |
# +----+------+-------------+
# |  0 | egon | 13434345679 |
# |  1 | alex |             |
# |  2 | egon | 13434345678 |
# +----+------+-------------+
# 3 rows in set (0.00 sec)

 

# 主鍵也不能重複
# mysql> insert into t12 (name,phone) values ('egon','13434345677');
# ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

 

# 建立部門表
# mysql> create table department (id int primary key auto_increment,dep_name varchar(20) not null);
# Query OK, 0 rows affected (0.16 sec)

# 建立員工表 外鍵關聯部門表中的id字段
# mysql> create table staff (sid int primary key auto_increment,sname varchar(20) not null,dep_id int, foreign key(dep_id) references department(id));
# Query OK, 0 rows affected (0.21 sec)

# mysql> desc staff;
# +--------+-------------+------+-----+---------+----------------+
# | Field  | Type        | Null | Key | Default | Extra          |
# +--------+-------------+------+-----+---------+----------------+
# | sid    | int(11)     | NO   | PRI | NULL    | auto_increment |
# | sname  | varchar(20) | NO   |     | NULL    |                |
# | dep_id | int(11)     | YES  | MUL | NULL    |                |
# +--------+-------------+------+-----+---------+----------------+
# 3 rows in set (0.01 sec)
#
# mysql> show create table staff;
# | Table | 
Create Table staff CREATE TABLE `staff` (
#   `sid` int(11) NOT NULL AUTO_INCREMENT,
#   `sname` varchar(20) NOT NULL,
#   `dep_id` int(11) DEFAULT NULL,
#   PRIMARY KEY (`sid`),
#   KEY `dep_id` (`dep_id`),
#   CONSTRAINT `staff_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `department` (`id`)
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
# 1 row in set (0.00 sec)

 

完整性約束補充

 

not null      非空
    # default 默認值
        # 若是不輸入就是用默認的實質
unique        惟一 : 惟一能夠有一個空
    # auto_increment  只有數字類型才能設置自增
    # 聯合惟一
        # 就是給一個以上的字段設置 惟一約束
primary key   主鍵  惟一+非空 加速查詢 每張表只能有一個主鍵
    # 當咱們以非空而且惟一的約束來建立一個表的時候,
    # 若是咱們沒有指定主鍵,那麼第一個非空惟一的字段將會被設置成主鍵
    # 聯合主鍵
        # 就是給一個以上的字段設置 惟一非空約束

foreign key   外鍵  Innodb
    # 外表中的一個惟一字段
    # on delete cascade
    # on update cascade

 

# course : cid,cname,cprice
# student : sid,sname,age,course_id

# 若是咱們沒有指定主鍵,那麼第一個非空惟一的字段將會被設置成主鍵
# mysql> create table t13 (id int unique not null);
# Query OK, 0 rows affected (0.15 sec)
#
# mysql> desc t13;
# +-------+---------+------+-----+---------+-------+
# | Field | Type    | Null | Key | Default | Extra |
# +-------+---------+------+-----+---------+-------+
# | id    | int(11) | NO   | PRI | NULL    |       |
# +-------+---------+------+-----+---------+-------+
# 1 row in set (0.01 sec)
#
# # 非空 + 惟一約束不能插入空值
# mysql> insert into t13 values (null);
# ERROR 1048 (23000): Column 'id' cannot be null
# mysql> create table t14 (id1 int unique not null,id2 int unique not null);
# Query OK, 0 rows affected (0.17 sec)
#
# mysql> desc t14;
# +-------+---------+------+-----+---------+-------+
# | Field | Type    | Null | Key | Default | Extra |
# +-------+---------+------+-----+---------+-------+
# | id1   | int(11) | NO   | PRI | NULL    |       |
# | id2   | int(11) | NO   | UNI | NULL    |       |
# +-------+---------+------+-----+---------+-------+
# 2 rows in set (0.01 sec)

 

# # 主鍵不能爲空值
# mysql> insert into t14 (id1) values (1);
# ERROR 1364 (HY000): Field 'id2' doesn't have a default value

 

# 指定主鍵以後 其餘的非空 + 惟一約束都不會再成爲主鍵
# mysql> create table t15 (id1 int unique not null,id2 int primary key);
# Query OK, 0 rows affected (0.23 sec)
#
# mysql> desc t15;
# +-------+---------+------+-----+---------+-------+
# | Field | Type    | Null | Key | Default | Extra |
# +-------+---------+------+-----+---------+-------+
# | id1   | int(11) | NO   | UNI | NULL    |       |
# | id2   | int(11) | NO   | PRI | NULL    |       |
# +-------+---------+------+-----+---------+-------+
# 2 rows in set (0.01 sec)
#
# mysql> insert into t15 values (1,2);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> insert into t15 values (2,3);
# Query OK, 1 row affected (0.02 sec)
#
# mysql> insert into t15 values (4,4);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> insert into t15 values (4,5);
# ERROR 1062 (23000): Duplicate entry '4' for key 'id1'
# mysql>

 

# 設置聯合主鍵
# mysql> create table t16 (id int,ip char(15),port int ,primary key(ip,port));
# Query OK, 0 rows affected (0.15 sec)
#
# mysql> desc t16;
# +-------+----------+------+-----+---------+-------+
# | Field | Type     | Null | Key | Default | Extra |
# +-------+----------+------+-----+---------+-------+
# | id    | int(11)  | YES  |     | NULL    |       |
# | ip    | char(15) | NO   | PRI |         |       |
# | port  | int(11)  | NO   | PRI | 0       |       |
# +-------+----------+------+-----+---------+-------+
# 3 rows in set (0.01 sec)
#
# mysql> insert into t16 values (1,'192.168.0.1','9000');
# Query OK, 1 row affected (0.02 sec)
#
# mysql> insert into t16 values (1,'192.168.0.1','9001');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> insert into t16 values (1,'192.168.0.2','9000');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t16
#     -> ;
# +------+-------------+------+
# | id   | ip          | port |
# +------+-------------+------+
# |    1 | 192.168.0.1 | 9000 |
# |    1 | 192.168.0.1 | 9001 |
# |    1 | 192.168.0.2 | 9000 |
# +------+-------------+------+
# 3 rows in set (0.00 sec)
#
# mysql> insert into t16 values (2,'192.168.0.2','9000');
# ERROR 1062 (23000): Duplicate entry '192.168.0.2-9000' for key 'PRIMARY'
# mysql>

 

# 設置ip和port兩個字段聯合惟一
# mysql> create table t17 (id int primary key,ip char(15) not null ,port int not null, unique(ip,port));
# Query OK, 0 rows affected (0.17 sec)
#
# mysql> desc t17;
# +-------+----------+------+-----+---------+-------+
# | Field | Type     | Null | Key | Default | Extra |
# +-------+----------+------+-----+---------+-------+
# | id    | int(11)  | NO   | PRI | NULL    |       |
# | ip    | char(15) | NO   | MUL | NULL    |       |
# | port  | int(11)  | NO   |     | NULL    |       |
# +-------+----------+------+-----+---------+-------+
# 3 rows in set (0.01 sec)
#
# mysql> insert into t17 values (1,'192.168.0.1',9000);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> insert into t17 values (2,'192.168.0.1',9000);
# ERROR 1062 (23000): Duplicate entry '192.168.0.1-9000' for key 'ip'
# mysql> insert into t17 values (2,'192.168.0.1',9001);
# Query OK, 1 row affected (0.03 sec)
#
# mysql> insert into t17 values (3,'192.168.0.2',9001);
# Query OK, 1 row affected (0.03 sec)

 

# default 設置默認值
# mysql> create table t18 (id int primary key auto_increment,name varchar(20) not null,sex enum('male','female')
#     -> not null default 'male');
# Query OK, 0 rows affected (0.15 sec)
#
# mysql> desc t18;
# +-------+-----------------------+------+-----+---------+----------------+
# | Field | Type                  | Null | Key | Default | Extra          |
# +-------+-----------------------+------+-----+---------+----------------+
# | id    | int(11)               | NO   | PRI | NULL    | auto_increment |
# | name  | varchar(20)           | NO   |     | NULL    |                |
# | sex   | enum('male','female') | NO   |     | male    |                |
# +-------+-----------------------+------+-----+---------+----------------+
# 3 rows in set (0.01 sec)
#
# mysql> insert into t18 (name) values ('alex');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t18;
# +----+------+------+
# | id | name | sex  |
# +----+------+------+
# |  1 | alex | male |
# +----+------+------+
# 1 row in set (0.00 sec)
#
# mysql> insert into t18 (name) values ('egon'),('yuan'),('nazha');
# Query OK, 3 rows affected (0.02 sec)
# Records: 3  Duplicates: 0  Warnings: 0
#
# mysql> select * from t18;
# +----+-------+------+
# | id | name  | sex  |
# +----+-------+------+
# |  1 | alex  | male |
# |  2 | egon  | male |
# |  3 | yuan  | male |
# |  4 | nazha | male |
# +----+-------+------+
# 4 rows in set (0.00 sec)
#
# mysql> insert into t18 (name,sex) values ('yanglan','female');
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from t18;
# +----+---------+--------+
# | id | name    | sex    |
# +----+---------+--------+
# |  1 | alex    | male   |
# |  2 | egon    | male   |
# |  3 | yuan    | male   |
# |  4 | nazha   | male   |
# |  5 | yanglan | female |
# +----+---------+--------+
# 5 rows in set (0.00 sec)

 

# 外鍵 只有另外一個表中設置了unique的字段才能做爲本表的外鍵
# mysql> create table t20 (id int,age int,t19_id int,foreign key(t19_id) references t19(id));
# ERROR 1215 (HY000): Cannot add foreign key constraint
# mysql> create table t21 (id int unique ,name varchar(20));
# Query OK, 0 rows affected (0.17 sec)
#
# mysql> create table t20 (id int,age int,t_id int,foreign key(t_id) references t21(id));
# Query OK, 0 rows affected (0.21 sec)
#
# mysql> insert into t21 values (1,'python'),(2,'linux');
# Query OK, 2 rows affected (0.02 sec)

 

# 若是一個表找中的字段做爲外鍵對另外一個表提供服務,那麼默認不能直接刪除外表中正在使用的數據
# mysql> insert into t20 values (1,18,1);
# Query OK, 1 row affected (0.02 sec)
#
# mysql> insert into t20 values (2,38,2);
# Query OK, 1 row affected (0.02 sec)
#
# mysql> select * from t21;
# +------+--------+
# | id   | name   |
# +------+--------+
# |    1 | python |
# |    2 | linux  |
# +------+--------+
# 2 rows in set (0.00 sec)
#
# mysql> delete from t21 where id=1;
# ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db2`.`t20`, CONSTRAINT `t20_ibfk_1` FOREIGN KEY (`t_id`) REFERENCES `t21` (`id`))

 

# 外鍵 on delete cascade on update cascade
# mysql> create table course (cid int primary key auto_increment,cname varchar(20) not null,
#     -> cprice int not null);
# Query OK, 0 rows affected (0.16 sec)
#
# mysql> create table student (sid int primary key auto_increment,
#     -> sname varchar(20) not null,
#     -> age int not null,
#     -> course_id int,
#     -> foreign key(course_id)
#     -> references course(cid)
#     -> on delete cascade
#     -> on update cascade);
# Query OK, 0 rows affected (0.17 sec)
#
# mysql> insert into course (cname,cprice) values ('python',19800),('linux',15800);
# Query OK, 2 rows affected (0.03 sec)
# Records: 2  Duplicates: 0  Warnings: 0
#
# mysql> insert into student (sname,age,course_id) values ('yangzonghe',18,1),('hesihao',88,2);
# Query OK, 2 rows affected (0.03 sec)
# Records: 2  Duplicates: 0  Warnings: 0
#
# mysql> delete from course where cid = 1;
# Query OK, 1 row affected (0.03 sec)
#
# mysql> select * from student;
# +-----+---------+-----+-----------+
# | sid | sname   | age | course_id |
# +-----+---------+-----+-----------+
# |   2 | hesihao |  88 |         2 |
# +-----+---------+-----+-----------+
# 1 row in set (0.00 sec)
#
# mysql> update course set cid = 1 where cid = 2;
# Query OK, 1 row affected (0.03 sec)
# Rows matched: 1  Changed: 1  Warnings: 0
#
# mysql> select * from course;
# +-----+-------+--------+
# | cid | cname | cprice |
# +-----+-------+--------+
# |   1 | linux |  15800 |
# +-----+-------+--------+
# 1 row in set (0.00 sec)
#
# mysql> select * from student;
# +-----+---------+-----+-----------+
# | sid | sname   | age | course_id |
# +-----+---------+-----+-----------+
# |   2 | hesihao |  88 |         1 |
# +-----+---------+-----+-----------+
# 1 row in set (0.00 sec)

 

表結構的修改

 

語法:
1. 修改表名
      ALTER TABLE 表名 
                      RENAME 新表名;

2. 增長字段
      ALTER TABLE 表名
                      ADD 字段名  數據類型 [完整性約束條件…],
                      ADD 字段名  數據類型 [完整性約束條件…];
                            
3. 刪除字段
      ALTER TABLE 表名 
                      DROP 字段名;

4. 修改字段
      ALTER TABLE 表名 
                      MODIFY  字段名 數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                      CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                      CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];

5.修改字段排列順序/在增長的時候指定字段位置
    ALTER TABLE 表名
                     ADD 字段名  數據類型 [完整性約束條件…]  FIRST;
    ALTER TABLE 表名
                     ADD 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;
    ALTER TABLE 表名
                     CHANGE 字段名  舊字段名 新字段名 新數據類型 [完整性約束條件…]  FIRST;
    ALTER TABLE 表名
                     MODIFY 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;
相關文章
相關標籤/搜索