库和表 – 03
本文最后更新于34 天前,其中的信息可能已经过时,如有错误请留言

基础术语

当数据库作为一个技术名词时,它特指数据库管理系统,即DBMS。
“库”是使用DBMS构建的存储和管理业务流程数据的“容器”,其中存储有若干表、视图等数据库对象。 •通常一个项目对应一个“库”,“库”中的数据库对象只为这个项目服务。 “库”对应于项目,使得数据库系统有条理

外键(Foreign Key)

实体(Entity )

数据库理论的提出 Codd首先提议把关系代 数作为数据库查询语言 的基础,他把数学和计算机科学在信检索领域做了创造性的结合, 使得计算机对数据的查 询检索有了严格的数学保证,正是由于他的开创性工作直接推动了关系数据库的诞生

创建库 create database CreateByDatabse;

Navigator 区域:RMC选择create schema
控制面板:
//注意库名不能加引号
CREATE DATABASE 数据库名;
//或使用
create schema 数据库名;

database和schema等价,下只给database的形式

修改库的属性

在库名的右侧隐藏菜单中选择扳手 – 进入库属性

删除库 DROP DATABASE 数据库名;

RMC库名 – 选择Drop Scheme

直接删除数据库(若数据库不存在,会报错)
DROP DATABASE 数据库名;
安全删除:判断数据库存在则删除,不存在则不报错
DROP DATABASE IF EXISTS 数据库名;

3.3 数据类型

什么是数据类型:为了规范数据,以及便于计算机存储、查找数据,计算机科学家设计了数据类型,数据类型本质是一种存储规则

字符串类

类型长度特性长度范围存储规则典型适用场景
CHAR定长
显式声明长度
0-255 字节空格填充 / 读取时去末尾空格定长字符串
手机号、身份证号
VARCHAR变长
显式
0-65535 字节记录实际长度(占 1-2 字节)变长字符串
姓名、短评
TINYTEXT变长
无需指定长度
0-255 字节记录长度(占 2 字节)短文本字符串
用户备注
TEXT变长
无需指定长度
0-65535 字节记录长度(占 2 字节)长文本数据
文章正文

CHAR:
定长,即不管实际存储的字符串长度是多少,都会占用声明时指定的长度
若实际字符串长度不足声明长度,会用空格填充;读取时会自动去掉末尾空格。
适用场景:存储长度固定的字符串,如手机号、身份证号、性别(“男”“女”)等。

VARCHAR:
实际存储长度由内容决定,不会填充空格;会额外占用 1-2 字节来记录字符串的实际长度。

数字类

时间日期类

集合类

表操作

3.4 创建表

创建一个库CREATE DATABASE XXX; 设置这个库为当前库USE XXX;下面构建一个名为tb_student的表

CREATE TABLE ‘tb’.‘tb_student’ 
(
stu_num CHAR(11) NOT NULL,
name VARCHAR(20) NULL,
intro TINYTEXT NULL,
PRIMARY KEY (stu_num)
);

NULL(可省略,默认就是 NULL)表示该字段允许存储空值,即可以不赋值
NOT NULL表示该字段不允许存储空值,必须为其赋值

通过 PRIMARY KEY ('stu_num') 将 stu_num 字段设置为主键。主键具有唯一性和非空性,保证了表中每条记录都能被唯一标识

列名(Column Name):表中每一列的名称
主键(PK – Primary Key):勾选表示该列是表的主键。主键是表中用于唯一标识每条记录的字段(或字段组合),具有唯一性(表中该列值不能重复)和非空性(值不能为NULL
非空(NN – Not Null):勾选表示该列不允许为NULL值,即插入或修改数据时,该列必须有值
唯一(UQ – Unique):勾选表示该列的值在表中必须唯一,但与主键不同的是,唯一约束的列可以为NULL(若列没设置NN)。用于保证列中数据的唯一性,比如若有 “身份证号” 列,可设为唯一

3.5 修改表的结构 – 删除列,添加列,修改列名

添加列

  • 语法格式
    ALTER TABLE 表名
    ADD COLUMN 列名 数据类型 [约束条件] [AFTER 已有列名];
  • 约束条件 可设置非空(NOT NULL)、默认值(DEFAULT)等,AFTER 已有列名 可选,用于指定新列添加在某已有列之后,若不指定则添加在表的最后。
    • 示例中 ALTER TABLE tb_student ADD COLUMN sex ENUM ("男","女") NULL AFTER name;,就是在 tb_student 表的 name 列后添加 sex 列,类型为枚举(只能选 “男” 或 “女”),允许为空(NULL)。

对比 CHANGE COLUMN 用于修改列(与 ALTER COLUMN 等结合场景)

  • 语法格式ALTER TABLE 表名 / CHANGE COLUMN 原列名 新列名 数据类型 [约束条件];
  • 说明CHANGE COLUMN 功能更强大,不仅能修改列的数据类型、约束等,还能修改列名。示例中 ALTER TABLE tb_student CHANGE COLUMN sex sex ENUM ('男','女') NULL DEFAULT '男' ;,这里原列名和新列名都是 sex,主要是修改 sex 列的类型、允许为空以及默认值等属性。

删除列

  • 语法格式ALTER TABLE 表名 DROP COLUMN 列名;
  • 说明:用于从表中删除指定的列,删除后该列及对应的数据都会被移除。
    • 示例中 ALTER TABLE tb_student DROP COLUMN intro ;,删除 tb_student 表中的 intro 列。

3.6 删除表

Drop Table 表名

3.7 批量插入数据

INSERT INTO 表名 VALUES(”,”,”);

//因为学号定长而姓名不定长所以分别声明为Char和varChar
CREATE TABLE tb_student
(
stu_num char(11),
name varchar(20),
sex enum('男','女')
);

INSERT INTO tb_student VALUES
('16100101', '马诗' ,'男'),
('16130201', '博文' ,'女'),
('16130205', '黄弘' ,'男'),
('17130202', '邹睿睿' ,'男'),
('17130203', '马诗' ,'女');

作业代码

//建立数据库MyLib
CREATE DATABASE MyLib;
//创建student表
//stuID设为INT 类型(主键,自增更合理,可选);
//name设为VARCHAR(50);
//gender设为CHAR(2),默认值设为'男'(或'女',根据需求选择);
//school设为VARCHAR(100)。
USE MyLib;
CREATE TABLE student (
    stuID INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    gender CHAR(2) DEFAULT '男',
    school VARCHAR(100)
);
创建book表
bookID设为INT 类型(主键,自增);
title设为VARCHAR(100);
author设为VARCHAR(50);
publish设为VARCHAR(100);
price设为DECIMAL(10,2),默认值设为0。
CREATE TABLE book (
    bookID INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(50),
    publish VARCHAR(100),
    price DECIMAL(10,2) DEFAULT 0
);
创建record表
stuID和bookID作为联合主键,同时作为外键关联student和book表;
borrowdate和returndate设为DATE 类型。
CREATE TABLE record (
    stuID INT,
    bookID INT,
    borrowdate DATE,
    returndate DATE,
    PRIMARY KEY (stuID, bookID),
    FOREIGN KEY (stuID) REFERENCES student(stuID),
    FOREIGN KEY (bookID) REFERENCES book(bookID)
);
向student表插入 3 条记录
INSERT INTO student (name, gender, school) VALUES 
('张三', '男', '第一中学'),
('李四', '女', '第二中学'),
('王五', '男', '第一中学');

INSERT INTO book (title, author, publish, price) VALUES 
('MySQL从入门到精通', '张三', '机械工业出版社', 59.9),
('Python编程', '李四', '人民邮电出版社', 69.9),
('数据结构', '王五', '清华大学出版社', 45.0);

INSERT INTO record (stuID, bookID, borrowdate, returndate) VALUES 
(1, 1, '2025-10-01', '2025-10-15'),
(2, 2, '2025-10-02', '2025-10-20'),
(3, 3, '2025-10-03', '2025-10-25');

3.8 修改表中数据

在WorkBench中,如果没有给表指定主键出于安全考虑会报错(因为通过WHERE定位的stu_man可能不唯一),但如果讲其复制到命令行中可以执行,证明命令行的操作权限更大

3.9 删除表中数据

删除姓名为“博文一”的记录
Delete From XX表名 WHERE name = ‘ 博文一’;
如果不加WHERE,则是删除表中所有数据

数据完整性约束

3.10 创建非空约束

第二行报错,不会被执行

3.11 创建Check约束

-- 判断表是否存在,如果存在则删除
DROP TABLE IF EXISTS tb_bibliography1;

CREATE TABLE tb_bibliography1(
ISBN CHAR(20),
name CHAR(32),
price INT CONSTRAINT checkprice CHECK(price>0 AND price<1000)
);

INSERT INTO tb_bibliography1 VALUES ('9787113254100', 'Python语言及其应用', 66);
INSERT INTO tb_bibliography1 VALUES ('9787113254101', 'Python语言及其应用——典藏版', 1000);

3.12 创建单一键值的主键约束

CREATE TABLE tb_student2(
stu_num CHAR(9) PRIMARY KEY,
name CHAR(20)
);
--插入两条数据
INSERT INTO tb_student2(stu_num,name)
VALUES("16100101","马诗"),
("17130203","马诗");

会发现如果插入的两个数据的主键值相同,数据都不会被插入,原因后面会提到是MYSQL事务处理机制

3.13 创建非单一键值的主键约束

创建借阅表(tb_record1),定义四个属性,学生的学号(stu_num),条码号(barcode)和借书日期(borrow_time),它们的组合作为借阅表的联合主键,还书日期(return_time)是借阅表的另外一个属性

CREATE TABLE tb_record1(
stu_num CHAR(20),
barcode CHAR(32),
borrow_time DATETIME,
return_time DATETIME,
CONSTRAINT PK_tb_record1 PRIMARY KEY(stu_num, barcode, borrow_time)
);

INSERT INTO tb_record1
VALUES('16100101', 'I247.56', '2019-04-17 16:35:54', '2019-04-18 17:36:15');

INSERT INTO tb_record1
VALUES('17130202', 'TP311.12', '2019-05-03 16:54:41', NULL);

非单一键值冲突会插入一条,并不像上面一样全部忽略

3.14 创建外键约束

CONSTRAINT 外键约束名 FOREIGN KEY (从表外键列) REFERENCES 主表名 (主表主键列)

外键(FOREIGN KEY)主要用于建立表与表之间的关联关系,确保数据的参照完整性。约束数据的一致性:在tb_book2中,ISBN作为外键参照tb_bibliography2ISBN,意味着tb_book2中插入或修改的ISBN值,必须在tb_bibliography2ISBN中存在(除非设为NULL),否则操作会被拒绝。

CREATE TABLE tb_bibliography2(
ISBN CHAR(20) PRIMARY KEY,
name CHAR(32),
price FLOAT(6, 2)
);

CREATE TABLE tb_book2(
barcode CHAR(9) PRIMARY KEY,
ISBN CHAR(32),
status ENUM('0', '1'),
CONSTRAINT FK_book2 FOREIGN KEY (ISBN) REFERENCES tb_bibliography2(ISBN)
);

INSERT INTO tb_bibliography2 VALUES ('9787113254100', 'Python语言及其应用', '62.20');
INSERT INTO tb_book2 VALUES('TP311.11', '9787113254100', '1');
INSERT INTO tb_book2 VALUES('TP122.32', '9787569302585', '1');

后面这条操作会被拒绝,因为tb_bibliography2中没有9787569302585

在设置外键的情况下,操作顺序很重要,要先删除被关联的内容在删除关联的内容,在这个例子中就是先删除tb_book2

DROP TABLE IF EXISTS tb_book2;
DROP TABLE IF EXISTS tb_bibliography2;

存储引擎


-- 创建主表 tb_student4
CREATE TABLE tb_student4(
    stu_num CHAR(9) PRIMARY KEY,
    name CHAR(20),
    school CHAR(10)
) ENGINE INNODB;

-- 创建关联表 tb_inf_student4(含外键关联)
CREATE TABLE tb_inf_student4(
    stu_num CHAR(9),
    address CHAR(64),
    CONSTRAINT FOREIGN KEY(stu_num) REFERENCES tb_student4(stu_num)
) ENGINE INNODB;

-- 问题(1)相关表操作
-- 判断表是否存在,存在则删除
DROP TABLE IF EXISTS tb_inf_student4;
DROP TABLE IF EXISTS tb_student4;

-- 插入数据(先插主表,再插关联表,符合外键约束)
INSERT INTO tb_student4 VALUES ('000000001','张三','信息学院');
INSERT INTO tb_inf_student4 VALUES ('000000001','北京市石景山区晋元庄路5号');

-- 创建主表 tb_student5(存储引擎为 MyISAM)
CREATE TABLE tb_student5(
    stu_num CHAR(9) PRIMARY KEY,
    name CHAR(20),
    school CHAR(10)
) ENGINE MyISAM;

-- 创建关联表 tb_inf_student5(含外键关联,存储引擎为 MyISAM)
CREATE TABLE tb_inf_student5(
    stu_num CHAR(9),
    address CHAR(64),
    CONSTRAINT FOREIGN KEY(stu_num) REFERENCES tb_student5(stu_num)
) ENGINE MyISAM;

-- 插入数据(先插主表,再插关联表,符合外键约束)
INSERT INTO tb_student5 VALUES ('000000001','张三','信息学院');
INSERT INTO tb_inf_student5 VALUES ('000000001','北京市石景山区晋元庄路5号');

InnoDB是默认的存储引擎,其能对外键约束进行判断但是MYISAM不能,所以代码最后的Insert并不会报错

补充:查看表结构

语句特点适用场景
DESC / DESCRIBE 表名简洁、快速,核心信息一目了然日常快速查看表结构
SHOW COLUMNS FROM 表名与 DESC 功能一致,语法不同习惯这种写法的场景
SHOW CREATE TABLE 表名详细、完整,含约束 / 存储引擎等所有信息需复制建表语句、排查约束问题等
学习笔记如有侵权,请提醒我,我会马上删除
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇