目录
数据库基础
库的操作
表的操作
数据类型
表的约束
一、MySQL在Centos 7环境安装
su - //切换成超级用户
ps axj | grep mysql
systemctl stop mysqld
rpm -qa | grep mysql | xargs yum -y remove
//repo.mysql.com 网址
cat /etc/*release mkdir mysql /
/下载对应的mysql版本
//安装yum源
yum list | grep mysql //查看mysql是否生效
//安装mysql
yum install -y mysql-community-server
//秘钥过期解决方法如下
systemctl start mysqld //启动mysql
ps ajx | grep mysqld
netstat -nltp //查服务端口号
//登录方式
vim /etc/my.cnf //打开配置文件
//最后一行加入:skip-grant-tables,并保存退出
systemctl restart mysqld //重新启动
mysql -u root -p //直接无密码登录
/var/lib/mysql //默认 存储位置
//配置my.cnf,主要是数据库客户端和服务器的编码格式
//如下图
vim /etc/my.cnf
//character-set-server=utf8 客户端的编码格式
//default-storage-engine=innodb 默认存储引擎
systemctl restart mysqld //重启
netstat -nltp
二、数据库基础
//连接
mysql -h 127.0.0.1 -P 3306 -u root -p
//-h 指明登录部署了mysql服务的主机
//-P 指明要访问的端口号
//-u 指明登录用户 -p 指明需要输出入密码
quit //退出
//目前是免密码登录的,后面必须设置密码;密码输入的时候,是不会回回显的
MySQL 是数据库的服务端 MySQLd 是数据库服务的服务器端 MySQL本质: 基于C(mysql)S(mysqld) 模式的一种网络服务 MySQL 是一套提供数据存取服务的网络程序 数据库一般指的是,在磁盘或者内存中存储的特定结构组织的数据--将来在磁盘上存储的一套数据库方案 数据库服务--mysqld 一般的文件提供了数据的存储功能,但是文件并没有提供很好的数据管理能力(用户角度) 数据库本质:对数据内容存储的一套解决方案,
服务器、数据库、表关系
所谓安装数据库服务器(mysqld),只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库;
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据;
数据库服务器、数据库和表的关系如下:
SQL分类
DDL:data definition language ,数据定义语言,用来维护存储数据的结构, eg:create drop alter
DML: data manipulation language, 数据操纵语言,用来对数据进行操作,eg:insert delete,update,DML中又单独分了一个DQL,数据查询语言,eg:select
DCL:data control language, 数据控制语言,主要负责权限管理和事务,eg:grant revoke commit
存储引擎
存储引擎是,数据库管理系统如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法;
MySQL的核心就是插件式存储引擎,支持多种存储引擎
三、MySQL操作库
显示数据库 : show databases;
创建数据库 : create database if not exists db_name; --本质就是在/var/lib/mysql 创建一个目录
删除数据库 : drop database db_name; --删除目录
编码集
创建数据库的时候,有两个编码集:
1.数据库编码集,数据库未来存储数据
2.数据库校验集,支持数据库,进行字段比较使用的编码,本质也是一种读取数据库中的数据采用的编码格式
即:数据库无论对数据做任何操作,都必须保证操作和编码是编码一致的
//查看默认编码规则
show variables like 'character_set_database';
//查看默认校验规则
show variables like 'collation_database';
//查看数据库支持的字符集编码规则
show charset;
//查看数据库支持的字符集校验规则
show collation;
//当创建数据库没有指定字符集和校验规则时,系统默认字符集:utf8,校验规则是:utf8_general_ci
//创建一个使用utf8字符集的 数据库
create database db2 charset=utf8;
//创建一个shiyongutf8字符集,并带校对规则db3 数据库
create database db3 charset=utf8 collate utf8_general_ci
校验集是会影响结果滴
system clear //在mysql里清页面
//增
create database test1 collate utf8_general_ci;//utf8_general_ci 不区分大小写
create database test1 collate utf8_general_bin;//utf8_general_bin 区分大小写
use test1; //!!!!!!
create table if not exists person (name varchar(20));
show tables;
desc person;
insert into person (name) values ('a');
insert into person (name) values ('A');
...
select * from person; //查看内容
select * from person where name='a';
select * from person order by name;
操纵数据库
show databases; //查看数据库
show create databases 数据库名; //显示创建数据库
//数据库删除
drop database [if exists] db_name;
//执行删除后的结果:数据库内部看不到对应的数据库,对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
use db_name;
show tables;
select database(); //查看在哪个数据库下
//修改数据库 对数据库的修改主要指修改数据库的字符集,校验规则
cat db_name/db.opt //打印编码集
alter database db_name;
eg: alter database test charset=gbk collate gbk_chinese_ci;
show create database db_name; //显示创建的编码规则
备份和删除
show databases;
use db_name;
show tables;
select * from table_name; //打印表内容
//备份
mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
eg: mysqldump -P3306 -u root -p -B mytest > mytest.sql //会备份在当前目录下
其实是把整个创建数据库,建表,导入数据的语句都装载这个文件中
ls /var/lib/mysql //查看
//还原 例子
mysql> source /home/mysql/mytest.sql;
//备份其中一张表
mysqldump -u root -p 表名1 表名2 > /../XX.sql;
//同时备份多个数据库
mysqldump -u root -p -B db_name1 db_name2 .. > 数据库存放路径 ;
//如果备份一个数据库时,没有带上-B 参数,在恢复数据库时,需要先创建空数据库,然后使用数据库,再 使用source 来还原
show processlist; //查看连接情况
四、表结构的操作(DDL)
创建表
crate table [if not exists] table_name(
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
//创建表案例
create table if not exists users(
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 collate utf8_general_ci engine MyISAM;
//charset=utf8 collate=utf8_general_ci engine InnoDB; //默认存储引擎
//不同的存储引擎,创建表的文件不一样,users表存储引擎是MyISAM,在数据目中有三个不同的文件,分 别是 users.frm : 表结构 users.MYD : 表数据 users.MYI : 表索引
查看表
select database(); //显示所在数据库
show tables; //显示数据库有几张表
desc table_name; //表信息 desc==describe
show create table table_name \G //显示创建表的详细语句
修改表
修改某个表的结构,比如字段名字、字段大小、字段类型、表的字符集类型,表的存储引擎等,还有添加字段、删除字段等等。
alter table old_table_name rename to new_table_name; //修改表名
insert into table_name values (int,'XXXXX',...); //输入信息
select * from table_name; //打印表
alter table table_name add XX列名X varchar(128) comment 'XXXX' after 某列名;//添加列
alter table table_name modify XXXX varchar(60); //覆盖式修改列,这样comment会丢失
alter table table_name drop XXXXX; //删除字段要注意,删除字段机器对应的列数据都没了
alter table table_name change name xingming varchar(60) DEFAULT NULL; //改列名要带上属性
删除表
drop table table_name;
五、数据类型
分类
分类 |
数据类型 |
说明 |
数值类型 |
BIT(M) |
位类型,M指定位数,默认值1,范围1-64 |
TINYINT [UNSIGNED] |
带符号的范围-128~127,无符号范围0~255,默认有符号;1字节 | |
BOOL |
使用0和1表示真和假 | |
SMALLINT [UNSIGNED] |
带符号是-2^15 -- 2^15-1, 无符号是 2^16-1;2字节 | |
INT [UNSIGNED] |
带符号是-2^31 -- 2^31-1, 无符号是 2^32-1;4字节 | |
BIGINT [UNSIGNED] |
带符号是-2^63 -- 2^63-1, 无符号是 2^64-1;8字节 | |
FLOAT [(M,D)] [UNSIGNED] |
M指定显示长度,d指定小数位数,占用4字节 | |
DOUBLE [(M,D)] [UNSIGNED] |
表示比float精度更大的小数,占用空间8字节 | |
DECIMAL(M,D) [UNSIGNED] |
定点数M指定长度,D表示小数点的位数 | |
文本、二进制类型 |
CHAR(size) |
固定长度字符串,最大255 |
VARCHAR(size) |
可变长度字符串,最大长度65535 | |
BLOB |
二进制数据 | |
TEXT |
大文本,不支持全文索引,不支持默认值 | |
时间日期 |
DATA/DATATIME/TIMESTAMP |
日期类型(yyyy-mm-dd,(yyyy-mm-dd hh:mm:ss) timestamp时间戳 |
String类型 |
ENUM类型 |
ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值 |
SET类型 |
SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值,指定包括多个set成员的set列值时各成员之间用逗号隔开。这样set成员值本身不能包含逗号。 |
数据类型
如果向mysql特定的类型中插入不合法的数据,MySQL一般直接拦截,不允许做对应的操作。反过来,如果已经有数据被成功插入到mysql中,一定插入的时候是合法的。
所以,在MySQL中,数据类型一般也是一种: 约束。 约束:保证数据插入的合法性。
保证数据库中的数据是可预期的,完整的。
MySQL表中建立属性列,列名称在前,类型在后。
尽量不使用unsigned。
bit
float
float[(m,d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
//四舍五入
//float 表示的精度大约是7位
decimal
deciaml[(m,d)] [unsigned] :定点数m指定长度,d表示小数点的位数
//decimal 整数最大位数为65,支持小数最大位数d是30。如果d被省略,默认为0;如果m被省略,默认是10.
字符串类型
char
char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度值为255
varchar
varchar(L):可变长度字符串,L表示字符长度,最大长度为65535个字节
//关于varchar(len),len到底是多大,这个len值,和标的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是 1-3个字节用于记录数据大小,所以说有效字节数是65532
当表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf8中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2个字节)
//varchar会多占用一两个字节,用以记录字符串长度
日期和时间类型
常用的日期有如下三个:
data: 日期,'yyyy-mm-dd' ,占用三字节
datatime: 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用8字节
timestamp:时间戳,从1970年开始的'yyyy-mm-dd HH:ii:ss'格式 和 datatime 完全一致,占用四字节
//
updata table_name set field='xxxxxxxx' //filed是表中元素名
enum 和 set
-
enum: 枚举,单选类型
-
set: 集合,多选类型
mysql> create table if not exists votes ( -> username varchar(30), -> gender enum('男','女'), -> hobby set('代码','羽毛球','乒乓球','足球','游泳') -> ); insert into votes values ('张飞', '男', '代码'); insert into votes values ('林宇', 1, '代码'); mysql> select * from votes; +----------+--------+--------+ | username | gender | hobby | +----------+--------+--------+ | 张飞 | 男 | 代码 | | 林宇 | 男 | 代码 | +----------+--------+--------+ 2 rows in set (0.00 sec) insert into votes values('xxx',2,yyy); //yyy用二进制,类似于位段来表示,如7,即是111,就 是代码 羽毛球 乒乓球 select * from votes where gender='女'; select * from votes where gender=2; 集合查询使用find_in_set函数 //find_in_set(sub,str_list):如果sub在str_list中,则返回下标;如果不在,返回0;str_list用 //逗号分隔的字符串; select * from votes where find_in_set('羽毛球',hobby); mysql> select * from votes; +----------+--------+-------------------------+ | username | gender | hobby | +----------+--------+-------------------------+ | 张飞 | 男 | 代码 | | 林宇 | 男 | 代码 | | 张三 | 女 | 足球,游泳 | | 张三 | 女 | 足球,游泳 | | 张三 | 女 | 羽毛球,足球,游泳 | | 李四 | 女 | 羽毛球,足球,游泳 | | ss | 女 | 羽毛球 | +----------+--------+-------------------------+ mysql> select * from votes where hobby='羽毛球'; +----------+--------+-----------+ | username | gender | hobby | +----------+--------+-----------+ | ss | 女 | 羽毛球 | +----------+--------+-----------+ mysql> select * from votes where find_in_set('羽毛球',hobby); +----------+--------+-------------------------+ | username | gender | hobby | +----------+--------+-------------------------+ | 张三 | 女 | 羽毛球,足球,游泳 | | 李四 | 女 | 羽毛球,足球,游泳 | | ss | 女 | 羽毛球 | +----------+--------+-------------------------+ select * from votes where find_in_set('羽毛球',hobby) and find_in_set('代码',hobby);
六、表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
表的约束很多,主要介绍如下:null/not null, default,comment, zerofill, primary key, auto_increment, unique key.
表的约束:表中一定要有各种约束,通过约束,让未来插入数据库中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的!
约束的最终目标:保证数据的完整性和可预期性。
空属性
-
两个值:null (默认的)和 not null (不为空);
-
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空无法参与运算
mysql> create table if not exists myclass(
-> class_name varchar(20) not null, //not null 不允许为空
-> class_room varchar(20) not null,
-> other varchar(20)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc myclass;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(20) | NO | | NULL | |
| other | varchar(20) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> show create table myclass \G
*************************** 1. row ***************************
Table: myclass
Create Table: CREATE TABLE `myclass` (
`class_name` varchar(20) NOT NULL,
`class_room` varchar(20) NOT NULL,
`other` varchar(20) DEFAULT NULL //未设置,但是系统自动加了默认为空
) ENGINE=InnoDB DEFAULT CHARSET=utf8
默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
默认值生效:数据再插入时不给该字段赋值,就是用默认值。
mysql> create table if not exists t4(
-> name varchar(20) not null,
-> age tinyint unsigned default 18,
-> gender char(1) default '男'
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t4;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 18 | |
| gender | char(1) | YES | | 男 | |
+--------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
default:如果设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的。
not null 和 default 一般不需要同时出现,因为dafault 本身有默认值,不会为空。
列描述
comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解
通过desc看不到注释信息,要通过 show create table table_name \G 来查看
zerofill
格式化显示
mysql> create table if not exists t5(
a int unsigned not null,
b int unsigned not null
);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t5;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| a | int(10) unsigned | NO | | NULL | |
| b | int(10) unsigned | NO | | NULL | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show create table t5 \G
*************************** 1. row ***************************
Table: t5
Create Table: CREATE TABLE `t5` (
`a` int(10) unsigned NOT NULL,
`b` int(10) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into t5 (a,b) values ('1','2');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5;
+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 1 | 2 |
+---+---+
2 rows in set (0.00 sec)
mysql> alter table t5 modify b int unsigned zerofill not null;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t5;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| a | int(10) unsigned | NO | | NULL | |
| b | int(10) unsigned zerofill | NO | | NULL | |
+-------+---------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from t5;
+---+------------+
| a | b |
+---+------------+
| 1 | 0000000002 |
| 1 | 0000000002 |
+---+------------+
//数值前面多了九个0,这既是zerofill属性的作用,如果宽度小于设定的宽度,自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1,
主键
primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;
主键所在的列通常是整数类型。
mysql> create table if not exists t6(
-> id int unsigned primary key comment '学号',
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t6;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show create table t6 \G
*************************** 1. row ***************************
Table: t6
Create Table: CREATE TABLE `t6` (
`id` int(10) unsigned NOT NULL COMMENT '学号',
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> select * from t6;
+----+--------+
| id | name |
+----+--------+
| 1 | 张飞 |
+----+--------+
1 row in set (0.00 sec)
mysql> insert into t6 values (1,'张飞'); //不可再插入 id = 1
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into t6 values (2,'刘备');
Query OK, 1 row affected (0.00 sec)
mysql> update t6 set name='吕布' where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t6;
+----+--------+
| id | name |
+----+--------+
| 1 | 张飞 |
| 2 | 吕布 |
+----+--------+
2 rows in set (0.00 sec)
mysql> select * from t6 where id = 2;
+----+--------+
| id | name |
+----+--------+
| 2 | 吕布 |
+----+--------+
1 row in set (0.00 sec)
mysql> alter table t6 drop primary key; //删除主键
Query OK, 2 rows affected (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc t6;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table t6 add primary key(id); //增加主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键;
mysql> create table pick_course(
-> id int unsigned,
-> course_id int unsigned comment '课程编号',
-> grade tinyint unsigned comment '学生的课程分数',
-> primary key (id,course_id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc pick_course;
+-----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| course_id | int(10) unsigned | NO | PRI | NULL | |
| grade | tinyint(3) unsigned | YES | | NULL | |
+-----------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
自增长
auto_increment :当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
-
任何一个字段要做自增长,前提是本身是一个索引
-
自增长字段必须是整数
-
一张表最多只能有一个自增长
mysql> create table if not exists tt21( -> id int unsigned primary key auto_increment, -> name varchar(20) not null -> ); Query OK, 0 rows affected (0.03 sec) mysql> desc tt21; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | +-------+------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> insert into tt21 (name) values ('a'); Query OK, 1 row affected (0.03 sec) mysql> insert into tt21 (name) values ('b'); Query OK, 1 row affected (0.01 sec) mysql> insert into tt21 (name) values ('c'); Query OK, 1 row affected (0.00 sec) mysql> select * from tt21; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ 3 rows in set (0.00 sec) mysql> create table tt22( -> id int unsigned primary key auto_increment, -> name varchar(20) not null -> ) auto_increment = 500; Query OK, 0 rows affected (0.02 sec) mysql> show create table tt22; +-------+-------------+ | Table | Create Table| +-------+-----------------------------------------------+ | tt22 | CREATE TABLE `tt22` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=utf8 | +-------+-----------------------------------------------+ 1 row in set (0.00 sec) //不设置时,自动从 1 开始,插入一个数值后,就会从插入的数值开始计数 select last_insert_id(); //查看auto_increment
索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些纸的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排列顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行,这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
唯一键
一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不作唯一性比较。
mysql> create table stu(
id char(20) unique comment '这是一个学生的唯一键',
name varchar(32) not null
);
Query OK, 0 rows affected (0.03 sec)
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | char(20) | YES | UNI | NULL | |
| name | varchar(32) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key(字段名) references 主表(列)
mysql> create table if not exists class(
-> id int primary key,
-> name varchar(32) not null
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc class;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(32) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> create table if not exists student(
-> id int unsigned primary key,
-> name varchar(20) not null,
-> telphone varchar(32) unique key,
-> class_id int,
-> foreign key(class_id) references class(id)
-> );
mysql> desc student;
+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| telphone | varchar(32) | YES | UNI | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
+----------+------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)