MySQL修行记【2】 数据表的基本操作

在像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
);
tb_emp1 表结构
字段名称 数据类型 备注名称
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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章