在像MySQL這樣的關係型數據庫中,數據表是數據庫中最重要,最基本的操作對象,是數據存儲的基本單位。下文簡稱爲“表”
1. 查看數據庫中的所有表,以及 表的創建 / 銷燬 / 查看概要 / 查看詳情 / 清空內容 / 改名
創建表以前,必須指定數據庫,使用 use 數據庫名;
create table 表名
(
字段名1 數據類型 列約束條件 默認值,
字段名2 數據類型 列約束條件 默認值,
字段名3 數據類型 列約束條件 默認值,
...
字段名N 數據類型 列約束條件 默認值,
[表級約束條件]
);
create database test_db; --創建數據庫test_db
use test_db; --切換當前數據庫爲test_db
create table tb_emp1 --在test_db內創建表 tb_emp1
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
字段名稱 | 數據類型 | 備註名稱 |
id | INT(11) | 員工編號 |
name | VARCHAR(25) | 員工名稱 |
deptId | INT(11) | 所在部門編號 |
salary | FLOAT | 工資 |
查看錶的概要信息
desc tb_emp1;
等同於如下語句
describe tb_emp1;
查看錶的詳細信息(即創建信息,包括表中存在的所有約束)
show create table tb_emp1;
銷燬表示例
use test_db;
drop table tb_emp1;
查看數據庫中的所有表
use test_db;
show tables;
修改表名 (語法: alter table 原表名 rename 新表名;)
alter table tb_emp1 rename emp1_tb;
2. 使用主鍵約束
主鍵,又名主碼,爲表中一列或多列的組合。主鍵約束要求主鍵數據唯一,並且不爲空。它能唯一地標識表中的一條記錄,可以結合外鍵來定義不同表間的關係,並可以加快數據庫查詢的速度。主鍵分爲單字段主鍵和多字段聯合主鍵。
主鍵約束示例
create table tb_emp2(
id int(11) primary key,
name varchar(25),
deptId int(11),
salary float
);
或者
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
constraint pk primary key(id) -- 此處的pk爲約束名,可以自定義
);
多字段聯合主鍵示例
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
primary key(id, name, deptId)
);
或者
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
constraint pk primary key(id, name, deptId) -- 此處的pk爲約束名,可以自定義
);
3. 使用外鍵約束和非空約束
外鍵用來在兩個表的數據間建立鏈接,它可以是一列或者多列。一個表可以有一個或多個外鍵。外鍵對應的是參照完整性,一個表的外鍵可以爲空值,若不爲空值,則每一個外鍵值必須等於另一個表中中主鍵的某個值。
外鍵:它是本表的一個字段,可以不是主鍵,但對應另一張表的主鍵。外鍵主要作用是保證數據引用的完整性,定義外鍵後,不允許刪除在另一個表中具有關聯關係的行。
主表(父表):對於兩個具有關聯關係的表而言,相關聯字段中主鍵所在的那個表即是主表。刪除主表以前,必須刪除其所有從表(子表)或者 保留子表但要清除外鍵約束。
從表(子表):對於兩個具有關聯關係的表而言,相關聯字段中外鍵所在的那個表即是從表。單純的從表(子表)的內容可以直接刪除。
非空約束(Not Null Constraint)指字段的值不能爲空。對於使用了非空約束的字段,如果用戶在添加數據時沒有指定值,數據庫系統會報錯。
外鍵約束及非空約束示例
/* 創建一個部門表 */
create table tb_dept1(
id int(11) primary key,
name varchar(22) not null, -- not null爲非空約束,禁止此字段的值爲空
location varchar(50)
);
/* 創建一個員工表,並讓員工表的部門ID字段作爲外鍵關聯到部門表的主鍵 */
create table tb_emp1(
id int(11) primary key,
name varchar(25) not null, --非空約束
deptId int(11),
salary float,
constraint fk_tb_dept1 foreign key(deptId) references tb_dept1(id)
);
4. 使用唯一性約束和默認約束
唯一性約束(Unique Constraint)要求該列的每個值是唯一的,允許爲空,但只能存在一個空值。唯一性約束可以保證一列或者幾列不出現重複值。語法爲在定義列後直接指定唯一性約束。
默認約束爲指定某列的默認值,例如,如果男性較多,那麼,性別可以默認爲'男'。
示例
/* 唯一性約束示例 */
create tb_dept7(
id int(11) primary key,
name varchar(25) unique, --唯一性約束,指定部門名稱唯一,不存在重複
location varchar(50)
);
或者
create tb_dept7(
id int(11) primary key,
name varchar(25),
location varchar(50),
constraint uk unique(name) --uk可以自定義
);
/* 默認約束示例 */
create tb_emp7(
id int(11) primary key,
name varchar(25) not null,
deptId int(11) default 111, --默認部門ID爲111
salary float
);
5. 修改數據表
修改字段數據類型,關鍵詞爲modify
desc tb_emp3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | NO | PRI | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
alter table tb_emp3 modify name int(11); --將name的數據類型改爲int
desc tb_emp3;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | int(11) | NO | PRI | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+---------+------+-----+---------+-------+
修改字段名,關鍵詞爲 change,語法爲alter table 表名 舊的字段名 新的字段名 新的字段的數據類型,
不難從語法看出,change關鍵詞同樣支持修改字段的數據類型。
desc tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
將location改名爲loc,並重新指定數據類型
alter table tb_dept3 change location loc varchar(50);
desc tb_dept3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
將loc的數據類型利用change關鍵字改爲int(11)
alter table tb_dept3 change loc loc int(11);
desc tb_dept3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| loc | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
添加字段
語法:
ALTER TABLE <表名> ADD <新字段名> <數據類型> [約束條件] [FIRST | AFTER 已存在字段]
示例
添加無完整性約束條件的字段
alter table tb_dept3 add managerId int(10);
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
添加有完整性約束條件的字段
alter table tb_dept3 add column1 varchar(12) not null;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
在表的第一列添加一個字段
alter table tb_dept3 add column2 varchar(12) first;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
在表的指定列後添加一個字段
alter table tb_dept3 add column3 int(11) after name; --在name後新增列column3
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
刪除字段
語法:ALTER TABLE <表名> DROP <字段名>
示例:
先查看原表格概要
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
開始刪除列
alter table tb_dept3 drop column1; --刪除表中的列column1
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
修改字段的排列位置
對於一個數據表而言,在創建的時候,字段在表中的排序已經確定了。但表的結構並不是完全不可以改變的,可以通過ALTER TABLE來改變表中字段的相對位置,語法格式如下
ALTER TABLE <表名> MODIFY <字段1> <數據類型> FIRST|AFTER <字段2>;
示例1, 修改字段爲表的第一個
先查看原表
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | int(11) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
接下來將column1移動爲表的第一個字段
alter tb_dept3 modify column1 int(11) first;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column1 | int(11) | YES | | NULL | |
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
示例2, 修改字段到表的指定列後
先查看原表
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column1 | int(11) | YES | | NULL | |
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
接下來將column1移動到location列後
alter table tb_dept3 modify column1 int(11) after location;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| column1 | int(11) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
修改表的存儲引擎
存儲引擎是MySQL中的數據存儲在文件或者內存中的不同技術實現,可以根據實際需求選擇不同的引擎,甚至可以爲每一張表選擇不同的引擎。可以用show engines;查看系統支持的存儲引擎。
更改引擎語法 ALTER TABLE <表名> ENGINE=<新引擎的名字>
示例
先查看本機支持的引擎
show engines;
InnoDB
MRG_MYISAM
MEMORY
BLACKHOLE
MyISAM
CSV
ARCHIVE
PERFORMANCE_SCHEMA
FEDERATED
查看錶的創建信息
show create table tb_emp6;
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp6 | CREATE TABLE `tb_emp6` (
`id` int(11) NOT NULL,
`name` varchar(25) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
修改表的存儲引擎(默認引擎爲InnoDB)
alter table tb_emp6 engine=MyISAM;
再次查看錶的創建信息
show create table tb_emp6;
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp6 | CREATE TABLE `tb_emp6` (
`id` int(11) NOT NULL,
`name` varchar(25) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
刪除表的外鍵約束
語法:ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名>
示例:
創建部門表
create table tb_dept1(
id int(11) primary key,
name varchar(25) not null,
location varchar(50)
);
創建帶外鍵約束的員工表
create table tb_emp9(
id int(11) primary key,
name varchar(25) not null,
deptId int(11),
salary float,
constraint fk_deptId foreign key(deptId) references tb_dept1
);
查看員工表的詳細信息
show create table tb_emp9;
刪除外鍵約束
alter table tb_emp9 drop foreign keyfk_deptId;
再次查看被刪除約束信息後的員工表
show create table tb_emp9;