MySQL 设计和命令行模式下建立详解
发布时间 - 2026-01-10 22:23:26 点击率:次MySQL 设计和命令行模式下建立详解

系列文章:
MySQL 设计和命令行模式下建立详解
C++利用MySQL API连接和操作数据库实例详解
1.数据表的设计
MySQL数据库管理系统(DBMS)中,包含的MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
下面以大学熟悉的学生选课管理系统中用到的数据库为例,来设计相应的数据表。主要有三张表:学生表,课程表和选课表。
学生表设计:
| 字段(Field) | 类型(Type) | 可空(Null) | 键(Key) | 默认值(Default) | 其他(Extra) |
|---|---|---|---|---|---|
| 学号(studentNo) | VARCHAR(12) | N | PRI | NULL | |
| 姓名(name) | VARCHAR(12) | N | N | NULL | |
| 学院(school) | VARCHAR(12) | N | N | NULL | |
| 年级(grade) | VARCHAR(12) | N | N | NULL | |
| 专业(major) | VARCHAR(12) | N | N | NULL | |
| 性别(gender) | Boolean | N | N | NULL |
课程表设计:
| 字段(Field) | 类型(Type) | 可空(Null) | 键(Key) | 默认值(Default) | 其他(Extra) |
|---|---|---|---|---|---|
| 课程号(courseNo) | VARCHAR(10) | N | PRI | NULL | |
| 课程名(courseName) | VARCHAR(10) | N | N | NULL | |
| 课时(hour) | TINYINT Unsigned | N | N | NULL | |
| 课程学分(credit) | TINYINT Unsigned | N | N | 2 |
选课表设计:
| 字段(Field) | 类型(Type) | 可空(Null) | 键(Key) | 默认值(Default) | 其他(Extra) |
|---|---|---|---|---|---|
| 编号(id) | INT Unsigned | N | PRI | NULL | auto_increment |
| 学号(studentNo) | VARCHAR(12) | N | MUL | NULL | |
| 课程号(courseNo) | VARCHAR(10) | N | MUL | NULL | |
| 选课时间(time) | TIMESTAMP | N | N | CURRENT_TIMESTAMP |
对于上面三张数据表的设计,你会发现:
(1)MySQL在为数据定义字符串(字符)类型时,需要在类型名称的后面的小括号内指明最长字符数,即TypeName(M),这里的M指的是字符数,而不是数据占用的字节数。例如varchar(12),则表述存储的字符数不能超过12 ,超过12则截断,小于12个字符则以实际占用的存储空间来存储,这样就节省了存储空间。
(2)在对选课表的设计时,我们添加外键约束,可以使得两张表关联,保证数据的一致性和实现一些级联操作。
(3)MySQL中有三种Key和一个Index: Primary Key(主键), Unique Key(唯一键),Foreign Key(外键)和 Index(索引)。
四者的区别如下:
定义:
主键(Primary Key):唯一标识一条记录,不能有重复,不允许为空。
外键(Foreign Key):表的外键是另一表的主键, 外键可以有重复, 可以是空值。
唯一键( Unique Key):唯一标识一条记录,不能有重复,可以为空。
索引(Index):该字段可以有重复值记录,可以有空值,如果是唯一索引,那么就不可以有重复的记录,可以有空值。
作用:
主键:用来保证数据完整性。
外键:用来和其他表建立联系,以保证数据的一致性和级联操作。
唯一键:用来用防止数据插入的时候重复。
索引:是提高查询排序的速度。
个数:
主键:一个表只能有一个列是主键。
外键:一个表可以有多个列是外键。
唯一键:一个表可以有多个列是唯一键。
索引:一个表可以有多个列是索引。
从中可以看出,索引和唯一键很相似,二者的区别在于作用不同,索引用于提高查询速度,唯一键用于唯一约束。当然如果建立的索引是唯一索引的话,也可以起到唯一约束的作用。在MySQL具体实现上,索引需要建立数据结构,需要额外的磁盘空间来存储索引,而键(主键,外键和唯一键)都是逻辑层面的实现和约束,二者还是有着本质的区别。
还有就是MySQL的索引包括:普通索引(Index)、唯一索引(UNIQUE INDEX)、全文索引(FULLTEXT INDEX)、组合索引。这里就不要把唯一键和唯一索引弄混淆了!也不要把索引和其它的三种键弄混淆了。
还有一点需要注意的是,虽然键(key)和索引(index)有着本质的区别,但是当我们在建立主键或者唯一键的时候,也就建立了索引,MySQL和Oracle都是这么做的,要是不明白这一点,很容易把索引和主键和唯一键弄混淆。
唯一键可以起到唯一约束的作用,当然主键也可以起到唯一约束的作用。当然我们可以不建立唯一键和主键,直接为指定的数据表的列添加唯一约束。唯一约束保证指定列的值不能重复。
所以,关于上面的概念,大家不要咬文嚼字,而是根据功能去理解每一种KEY的作用,在什么场合需要去使用它。
比如需要主键约束的时候,我们就可以对某一列建立主键;
需要对某一列或者多个列进行唯一约束的时候,我们就建立唯一键或者唯一约束;
需要加快查询速度的时候,我们就建立相应类型的索引。
关于四者的理解,上未参考到权威的资料,请读者保持怀疑的态度接受。
2.数据库的建立
在安装完mysql之后,我们要建立自己的数据库。下面将详细地一步一步演示如何创建上面设计好的数据库。
在MySQL模式下,使用status命令可以查看MySQL版本,本人使用的MySQL版本:5.6.30 MySQL Community Server (GPL)。
关于mysql大小写问题,mysql命令是不区分大小写的。数据表的表名在windows下不分,linux下分。数据表的字段名在windows和linux下都不分。
(1)登录mysql DBMS
Linux命令行中输入如下命令:
mysql -hlocalhost -uroot -p123456
说明:依次指明登录mysql的主机地址,用户和用户密码。
(2)使用show查看当前mysql服务器上存在什么数据库
show databases;
说明:在进入mysql模式下,使用mysql命令时,每条语句要以分号结束。但是use [DatabaseName]却不用,可能是mysql的一个小bug。类似于quit和exit退出mysql的命令,不需要一个分号。(如果你喜欢,你可以用一个分号终止这样的语句)。
(3)创建数据库
mysql> CREATE DATABASE StudentCourse;
(4)使用use语句访问数据库
mysql>use StudentCourse;
(5)创建数据表student
mysql> create table student( studentNo varchar(12) not null, name varchar(12) not null, school varchar(12) not null, grade varchar(12) not null, major varchar(12) not null, gender boolean not null, primary key(studentNo) )engine=MyISAM default charset=utf8;
观察上面的建表语句,需注意以下几点:
(a)其中,布尔类型boolean在MySQL是以类型tinyint(1)来实现,这里的1指代的是数据显示时最短长度。
实际上tinyint(1)是可以插入-128到127之间的其它数值。因为mysql数据库中以 :数据类型(m)来定义数据类型,其中 数字m在不同的数据类型中表示含义是不同的。 整型数系统已经限制了取值范围,tinyint占一个字节、int占4个字节。所以整型数后面的m不是表示的数据长度,而是表示数据在显示时显示的最小长度(长度为字符数)。
tinyint(1) 这里的1表示的是最短显示一个字符。tinyint(2) 这里的2表示的是最短显示两个字符,但这里光设置m是没有意义的,你还需要指定当数据少于长度m时用什么来填充,比如zerofill(表示有0填充)。设置tinyint(2) zerofill你插入1时他会显示01。设置tinyint(4) zerofill你插1时他会显示0001。
(b)还要注意一点是,使用engine可指明引擎,如果省略了engine语句,则使用默认的引擎(MYISAM)。MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。
(c)设置default charset指明mysql数据表的编码方式,不显示指定编码方式的话,数据表的默认编码方式一般是latin1。也可以通过如下命令查看数据表的编码方式:
show create table student;
如果需要转换数据表的编码格式,使用如下命令:
alter table student convert to character set utf8;
如果想查看当前数据库的编码格式:
mysql>status; #或者 show variables like 'character%' ;
为了验证所建立的数据表是否是按照期望的方式创建的,使用如下命令:
#查看表中的列 SHOW COLUMNS FROM student; #或者直接使用describe describe student;
(6)创建数据表course
mysql> create table course( studentNo varchar(12) not null primary key, courseNo varchar(10) not null, hour tinyint unsigned not null, credit tinyint unsigned not null default 2 )engine=MYISAM default charset=utf8;
同样可以使用describe查看表信息:
(7)创建数据表courseSelection
mysql> create table courseSelection( id int unsigned not null auto_increment primary key, studentNo varchar(12) not null, courseNo varchar(10) not null, time timestamp not null default CURRENT_TIMESTAMP, FOREIGN KEY(studentNo) REFERENCES student(ISBN) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY(courseNo) REFERENCES course(courseNo) ON UPDATE CASCADE ON DELETE CASCADE )engine=MYISAM default charset=utf8 AUTO_INCREMENT=0;
查看表信息:
(8)其它关于数据库和数据表的操作命令
删除数据库:
mysql> DROP DATABASE 库名;
删除数据表:
mysql> DROP TABLE 表名;
将表中记录清空:
mysql> DELETE FROM 表名;
参考文献:
[1]http://www.runoob.com/mysql/mysql-data-types.html
[2]Mysql 查看、创建、更改 数据库和表
[3]php里tinyint(1)为什么还能插入99这个值?搜索
[4]MySQL引擎
[5]MySQL中的四种Key
[6]SQL的主键和外键约束
[7]唯一索引和唯一约束有什么区别
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# MySQL
# 数据库
# 设计和命令行模式
# 设计
# 数据库命令行模式
# PHP+MySQL投票系统的设计和实现分享
# PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
# MYSQL 数据库命名与设计规范
# mysql 数据库设计
# MySQL分表实现上百万上千万记录分布存储的批量查询设计模式详解
# MySQL 数据库设计复习笔记及项目实战
# 基于PHP+MySQL的聊天室设计
# MySQL和MongoDB设计实例对比分析
# 如何设计高效合理的MySQL查询语句
# 一键
# 主键
# 的是
# 多个
# 都是
# 最短
# 命令行
# 看表
# 就不
# 默认值
# 模式下
# 要把
# 他会
# 能有
# 三种
# 可以使用
# 不分
# 是唯一
# 三张
# 为空
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
创业网站制作流程,创业网站可靠吗?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何快速生成ASP一键建站模板并优化安全性?
如何在腾讯云免费申请建站?
如何快速搭建虚拟主机网站?新手必看指南
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel定时任务怎么设置_Laravel Crontab调度器配置
详解vue.js组件化开发实践
海南网站制作公司有哪些,海口网是哪家的?
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
jQuery中的100个技巧汇总
详解jQuery中的事件
js代码实现下拉菜单【推荐】
Laravel如何使用.env文件管理环境变量?(最佳实践)
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Python函数文档自动校验_规范解析【教程】
如何确认建站备案号应放置的具体位置?
JavaScript中的标签模板是什么_它如何扩展字符串功能
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Laravel如何使用Telescope进行调试?(安装和使用教程)
node.js报错:Cannot find module 'ejs'的解决办法
高防服务器租用如何选择配置与防御等级?
如何在阿里云虚拟服务器快速搭建网站?
大同网页,大同瑞慈医院官网?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
网站制作免费,什么网站能看正片电影?
北京网站制作的公司有哪些,北京白云观官方网站?
JavaScript如何操作视频_媒体API怎么控制播放
b2c电商网站制作流程,b2c水平综合的电商平台?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Windows Hello人脸识别突然无法使用
奇安信“盘古石”团队突破 iOS 26.1 提权
Python高阶函数应用_函数作为参数说明【指导】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
java中使用zxing批量生成二维码立牌
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】

