本文已参与「新人创作礼」活动,一起开启掘金创作之路
引言
创建和修改数据表,是数据存储过程中的重要一环。我们不仅需要把表创建出来,还需要正确地设置限定条件,这样才能确保数据的一致性和完整性。同时,表中的数据会随着业务需求的变化而变化,添加和修改相应的字段也是常见的操作。
面试题 4
SQL 语句主要分为哪些类别
SQL 语句可分为以下几类:
- 数据定义语言 DDL(Data Definition Language):例如 CREATE,DROP,ALTER 等,对逻辑结构等有操作的,其中包括表结构,视图和索引。
- 数据查询语言 DQL(Data Query Language):即查询操作,以 SELECT 关键字为主,各种简单查询、连接查询等都属于 DQL。
- 数据操纵语言 DML(Data Manipulation Language):例如 INSERT,UPDATE,DELETE 等,对数据进行操作的。DQL 与 DML共同构建了多数初级程序员常用的 增删改查 操作,而查询是较为特殊的一种,被划分到 DQL 中。
- 数据控制功能 DCL(Data Control Language):例如 GRANT,REVOKE,COMMIT,ROLLBACK 等,对数据库安全性、完整性等有操作的,可以简单的理解为权限控制等。
DROP、DELETE 与 TRUNCATE 的区别
三种都可以表示删除,其中的细微区别之处如下:
| DROP | DELETE | TRUNCATE | |
|---|---|---|---|
| SQL 语句类型 | DDL | DML | DDL |
| 回滚 | 不可回滚 | 可回滚 | 不可回滚 |
| 删除内容 | 从数据库中 删除表,所有的数据行,索引和权限也会被删除 | 表结构还在,删除表的 全部或者一部分数据行 | 表结构还在,删除表中的 所有数据 |
| 删除速度 | 删除速度最快 | 删除速度慢,需要逐行删除 | 删除速度快 |
因此,在不再需要一张表的时候,采用 DROP;
在想删除部分数据行时候,用 DELETE;
在保留表而删除所有数据的时候用 TRUNCATE。
创建和修改数据表实例
进货单头表(importhead),如下图所示:
这里的 1、2、3 表示门店的 3 种进货方式,分别是配送中心配送、门店采买和供货商直供。
进货方式这个字段的值能够默认是 1。
CREATE TABLE demo.importhead (
listnumber INT PRIMARY KEY AUTO_INCREMENT,
supplierid INT NOT NULL,
stocknumber INT NOT NULL,
--我们在字段importype定义为INT类型的后面,按照MySQL创建表的语法,加了默认值1。
importtype INT DEFAULT 1,
quantity DECIMAL(10,3),
importvalue DECIMAL(10,2),
recorder INT,
recordingdate DATETIME
);
SQL 约束有哪几种类型
约束是一种简单地强加于表中一列或多列的限制,从而保证表中数据一致性(准确和可靠)。以下为六大约束:
- 自增约束(AUTO_INCREMENT):声明字段值能够自动加 1,且不会重复;
- 非空约束(NOT NULL):保证该字段值一定不为空;
- 默认约束(DEFAULT):保证字段有默认值;
- 主键约束(PRIMARY KEY):标志一列或者多列,并保证其值在表内的唯一性;
- 外键约束(FOREIGN KEY):限制一列或多列中的值必须被包含在另一表的外键列中,并且在级联更新或级联删除规则建立后也可以限制其他表中的可用值;
- 唯一约束(UNIQUE): 限制一列或多列的值,保证字段值在表内的唯一性,可以为空(主键约束是一种特殊类型的唯一约束);
- 检查约束(CHECK):限制一列的可用值范围。
当我们创建新表的时候,会出现这样的情况:我们前面创建的进货单表,是用来存储进货数据的。但是,我们还要创建一个进货单历史表(importheadhist),用来存储验收过的进货数据。这个表的结构跟进货单表类似,只是多了 2 个字段,分别是验收人(confirmer)和验收时间(confirmdate)。针对这种情况,我们很容易想到可以通过复制表结构,然后在这个基础上通过修改表结构,来创建新的表。具体怎么实现呢?接下来,我就给你讲解一下。
首先,我们要把原来的表结构复制一下,代码如下:
CREATE TABLE demo.importheadhist
LIKE demo.importhead;
给这个新的表增加 2 个字段:confirmer 和 confirmdate,就可以用下面的代码:
ALTER TABLE demo.importheadhist
ADD confirmer INT; -- 添加一个字段confirmer,类型INT
ALTER TABLE demo.importheadhist
ADD confirmdate DATETIME; -- 添加一个字段confirmdate,类型是DATETIME
除了添加字段,我们可能还要修改字段,比如,我们要把字段名称“quantity”改成“importquantity”,并且把字段类型改为 DOUBLE.
ALTER TABLE demo.importheadhist
CHANGE quantity importquantity DOUBLE;
如果你不想改变字段名称,只想改变字段类型,例如,把字段“importquantity”类型改成 DECIMAL(10,3),你可以这样写:
ALTER TABLE demo.importheadhist
MODIFY importquantity DECIMAL(10,3);
还可以通过 SQL 语句向表中添加一个字段,我们甚至可以指定添加字段在表中的位置。
比如说,在字段 supplierid 之后,添加一个字段 suppliername,数据类型是 TEXT。我们可以这样写 SQL 语句:
ALTER TABLE demo.importheadhist
ADD suppliername TEXT AFTER supplierid;
总结
CREATE TABLE tablename(
字段名 字段类型 PRIMARY KEY
);
CREATE TABLE tablename(
字段名 字段类型 NOT NULL
);
CREATE TABLE tablename(
字段名 字段类型 UNIQUE
);
CREATE TABLE tablename(
字段名 字段类型 DEFAULT 值
);
-- 这里要注意自增类型的条件,字段类型必须是整数类型。
CREATE TABLE tablename(
字段名 字段类型 AUTO_INCREMENT
);
-- 在一个已经存在的表基础上,创建一个新表
CREATE demo.importheadhist LIKE demo.importhead;
-- 修改表的相关语句
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型;
ALTER TABLE 表名 ADD COLUMN 字段名 字段类型 FIRST|AFTER 字段名;
ALTER TABLE 表名 MODIFY 字段名 字段类型 FIRST|AFTER 字段名;
在表一级指定表的存储引擎:
ALTER TABLE 表名 ENGINE=INNODB;