7、mysql中的表结构操作
之前已經(jīng)介紹了字段以及修飾字段的一些屬性,根據(jù)特定的對象可以將字段進行組合,這就有了表的概念,接下來介紹一下如何操
作數(shù)據(jù)表結(jié)構(gòu)。對數(shù)據(jù)表結(jié)構(gòu)的操作有添加表、修改表、刪除表、查看表結(jié)構(gòu)。
添加表
格式:create table [if not exist] 表名( 字段名字1 數(shù)據(jù)類型 ,字段名字1 數(shù)據(jù)類型 )[表選項];
介紹一下每個部分的意思:
| create table | 固定格式,創(chuàng)建表的意思,必填 | ||
| if not exist | 表示如果表明不存在,創(chuàng)建,否則不創(chuàng)建,選填 | ||
| 表名 | 表的名字,必填 | ||
| 括號中的部分 | 聲明的字段,格式為:字段名 數(shù)據(jù)類型,當(dāng)有多個字段時,使用逗號隔開,必填 | ||
| 表選項(選填) | charset | 字符集,聲明格式:CHARSET=utf8 | |
| engine | 存儲引擎,格式:ENGINE=InnoDB | ||
| auto_increment | 自增開始值,設(shè)置:auto_increment=100 | ||
| .......... | |||
實例,創(chuàng)建一個user表
CREATE TABLE USER (id bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',age int(4) DEFAULT NULL COMMENT '年齡',name varchar(30) NOT NULL UNIQUE COMMENT '名稱',money decimal(12,2) DEFAULT NULL COMMENT '存款' ) ENGINE=InnoDB AUTO_INCREMENT=3 CHARSET=utf8;修改表
對于表的修改,用戶可自定義修改表的名稱、表選項、表中字段名、字段的類型、添加和刪除字段等
實例如下:
# 將表student更名為teacher rename table 舊名 to 新名; rename table student to teacher;# 修改表的字符集 alter table teacher charset = gbk;# 增加一個字段 alter table user add user_score double(5,2) not null default 0.00;# 修改一個字段 alter table user modify score varchar(30) default '';# 修改字段名 alter table user change 舊字段名 新字段名 類型; alter table user change score score_ssss varchar(30);# 刪除字段 alter table user drop score_ssss;# 刪除字段上的約束 -- 先查看對應(yīng)的約束有什么 show create table user; -- 刪除對應(yīng)的索引 alter table user drop index name;# ..........刪除表
# 刪除表 drop table [表名1],[表名2],[表名。。。] drop table user;注意:此操作一般不要使用,使用也要保證萬無一失
查看表結(jié)構(gòu)
# 查看當(dāng)前數(shù)據(jù)庫下所有表 show tables;# 按著表名關(guān)鍵字查詢表 show tables like ‘%關(guān)鍵字’;# 查看表創(chuàng)建語句 show create table user\g; show create table user\G ;# 查看表中字段信息 desc/describle user; show columns from user;在這里說一下表之間的關(guān)系,因為表是根據(jù)具體的業(yè)務(wù)需求創(chuàng)建的,所以表之間有各種關(guān)系,一般可歸為三類
| 一對一 | 表A中的一條數(shù)據(jù)和B中一條數(shù)據(jù)相關(guān),表B中的一條數(shù)據(jù)和A中一條數(shù)據(jù)相關(guān) |
| 一對多 | 表A中的一條數(shù)據(jù)和B中多條數(shù)據(jù)相關(guān),表B中的一條數(shù)據(jù)只與表A中一條數(shù)據(jù)相關(guān) |
| 多對多 | 表A中的一條數(shù)據(jù)和B中多條數(shù)據(jù)相關(guān),表B中一條數(shù)據(jù)與表A中多條數(shù)據(jù)相關(guān) |
在mysql中有外鍵這一概念,使用外鍵可以保持表之間的各種關(guān)系,但是在實際開發(fā)中,一般不使用外鍵,因為使用外鍵之后,開發(fā)人員對數(shù)據(jù)的可控性會降低,數(shù)據(jù)的操作更多的依賴于外鍵,更有甚者導(dǎo)致系統(tǒng)崩潰,所以實際開發(fā)中一般使用事務(wù)來保持關(guān)聯(lián)表中數(shù)據(jù)的一致性,所以這里只是簡單的介紹一下外鍵的使用,而不詳細介紹
外鍵
A表中一個字段(非主鍵)指向B表的主鍵,那么這個字段稱為外鍵,A表叫做B表的子表,B表叫做A表的父表。外鍵要求本身必須是一個索引(普通索引),如果字段本身沒有索引,聲明外鍵時數(shù)據(jù)庫會先創(chuàng)建一個索引,然后才會創(chuàng)建外鍵本身,一張表中可以有多個外鍵,但是名字不可相同
外鍵的新增和刪除
# 創(chuàng)建表時就給字段添加外鍵 create table card (id bigint(20) primary key auto_increment not null, uid bigint(20) not null ,card_number varchar(255) not null,-- 添加外鍵,外鍵名為f_uid,外鍵是uid字段,連接user表的id字段constraint f_uid foreign key(uid) references user(id) );# 創(chuàng)建表之后再添加外鍵 -- 先創(chuàng)建card表 create table card (id bigint(20) primary key auto_increment not null, uid bigint(20) not null ,card_number varchar(255) not null );-- 將uid作為外鍵 alter table card add constraint f_uid foreign key(uid) references user(id);# 外鍵不可以修改,所以需要先刪除,后修改 # 刪除外鍵 f_uid,分兩步:刪外鍵 ---> 刪索引(因為創(chuàng)建外鍵時,系統(tǒng)自動創(chuàng)建了索引) alter table card drop foreign key f_uid; alter table card drop index f_uid;外鍵的作用就是用來約束具有聯(lián)系的表之間的數(shù)據(jù),保證數(shù)據(jù)一致性,其約束模式有四種,如下:
| no action | 默認模式 |
| restrict | 嚴(yán)格模式,父表不能刪除或更新一個已經(jīng)被子表數(shù)據(jù)應(yīng)用的記錄,一般不使用 |
| cascade | 級聯(lián)模式,父表的操作,子表關(guān)聯(lián)數(shù)據(jù)跟著操作,例如:主表數(shù)據(jù)修改,子表對應(yīng)數(shù)據(jù)也級聯(lián)修改,一般修改操作使用 |
| set null | 置空模式,父表操作之后,子表對應(yīng)的數(shù)據(jù)(外鍵字段)被置空,一般刪除操作使用 |
下邊寫一個實例,來介紹一下約束模式的使用,在聲明主鍵時,在后邊加上對應(yīng)的操作和對應(yīng)的約束模式即可,如下:
# 創(chuàng)建外鍵fk_uid 并且設(shè)置約束模式,修改時是cascade,刪除時是set null alter table card add constraint fk_uid foreign key(uid) references user(id) on delete set null on update cascade;使用過程中,注意幾個地方:
1、當(dāng)設(shè)置約束模式時,外鍵字段不要設(shè)置為空約束
2、外鍵名不能重復(fù)
3、刪除外鍵時,要注意將創(chuàng)建外鍵時系統(tǒng)創(chuàng)建的索引也刪除,一般和外鍵名同名
4、必須保證表的存儲引擎是Innodb,如果不是,外鍵可以創(chuàng)建成功,但是沒有約束作用
5、外鍵字段類型必須與父表的主鍵類型一致
總結(jié)
以上是生活随笔為你收集整理的7、mysql中的表结构操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6、mysql中字段
- 下一篇: 8、mysql数据表中数据的增删改