1.原子性(A):事務是最小單位,不可再分 2.一致性(C):事務要求全部的DML語句操做的時候, 必須保證同時成功或者同時失敗 3.隔離性(I):事務A和事務B之間具備隔離性 4.持久性(D):是事務的保證,事務終結的標誌(內存的數據持久到硬盤文件中)
開啓事務:Start Transaction 事務結束:End Transaction 提交事務:Commit Transaction 回滾事務:Rollback Transaction
MyIsam 表級鎖,支持全文索引
只查詢多,修改少的時候使用
myisam,同一張表中的數據不能被同時修改python
memory 每一個用戶的登陸狀態
數據都存在內存中,讀取速度快
數據量小 並對服務器的內存有要求
斷電消失mysql
blackhole 黑洞
放進去的全部數據都不存linux
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)
+-------+-----------------------+------+-----+---------+-------+ | 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 | | +-------+-----------------------+------+-----+---------+-------+
指定列名插入數據 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');
# 查看全部列的數據 # 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 | # +------+----------+------+--------+-------------+----------+
# 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
# 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)
# 長度約束測試 # 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)
# 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 描述年月日時分秒
# 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)
# 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) #
# 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 字段名;