【MySQL数据库基础 二】DDL数据定义语句

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL数据库基础 二】DDL数据定义语句

数据库定义

数据库定义包括创建表、修改表以及删除表,当然更多的修饰在数据库的约束中提到。

创建表的语法

分为普通创建表方式和子查询创建表方式

普通建表方式

建表语法如下:

CREATE TABLE table_name (column_name column_type);

实际建表举例:

create table test
        #整型通常用int                                               
      test_id int,                    //每个列定义之间以英文逗号隔开
      #小数点儿数
      test_price  decimal,
      #普通长度文本,使用default 指定默认值
      test_name  varchar(255) default 'XXX',
      #大文本类型
      test_desc  text,
      #图片
      test_img blob,
      test_date datetime
    );

需要指明更多属性的建表方案:

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   //AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   //如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错
   `runoob_title` VARCHAR(100) NOT NULL,  
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   //PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;  //ENGINE 设置存储引擎,CHARSET 设置编码

子查询建表方式

子查询建表语法:

create table [模式名.] 表名    [column[,column…]]         //使用子查询语句建表,可以在建表的同时插入数据
as
subquery;

子查询建表实例,相当于将其它表的全部或部分数据拿来创建新表

#创建hehe数据表,该数据表和user_inf完全相同,数据也完全相同
create table hehe
as
select * from user_inf;   //以上方式为省略字段列表,新表的数据和字段与之前的完全相同

修改表的语法

包括修改表名以及删除、添加、修改表字段

修改表名

mysql> ALTER TABLE testalter_tbl RENAME TO tml;

删除、添加、修改表字段

修改表的列、增加列、删除列、重命名列

//删除表testalter_tbl的teacher列,如果数据表中只剩余一个字段则无法使用DROP来删除字段
mysql> ALTER TABLE testalter_tbl  DROP teacher; 
//增加表testalter_tbl的student列,并且指明数据类型,执行以上命令后,i 字段会自动添加到数据表字段的末尾
//如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)
mysql> ALTER TABLE testalter_tbl ADD student INT;
//修改列的数据类型把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
//在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型
mysql> ALTER TABLE testalter_tbl CHANGE teacher student  BIGINT;

删除表的语法

删除指定表

drop table TML;    //该表结构被删除,对象被删除,所有数据被删除,所有相关索引,约束被删除
truncate table TML  //truncate的作用是截断某表,具体作用是删除表的数据而不删除表的结构

修饰主要有以下几种操作:加约束,索引和视图,定义的部分都结合到修饰里来说,这里主要说说修饰

数据库约束

约束通常被写到系统表里,依据约束范围可以分为:单列约束:每个约束只约束一列。多列约束:每个约束可以约束多个数据列。依据约束指定时机可以分为:建表开始的时候为对应数据列指定约束。建表后创建,以修改的方式来增加约束。约束通常只能被建立和删除不能修改。

  • NOT NULL:非空约束,指定某列不得为空。
  • UNIQUE:唯一约束,指定某列或者几列的组合不能重复。
  • PRIMARY KEY:主键:指定该列的值可以唯一的标识该记录。例如一个学生有很多属性,可以把学号作为主键,这样重名也没关系
  • FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
  • CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

接下来分别就这几种约束进行介绍

非空约束 NOT NULL

所有数据库中的数据类型都可以为null,空字符串和0含义并不等于null只能作为列级约束来使用

建表时创建非空约束

creat table TML
  (
     TML_id int not null,       //id不能为空
     TML_name varchar(255) default 'xyz' not null,  //名字不能为空
     TML_gender  varchaer(2)   null     //gender是性别的意思                                             
  );

修改表时增加或删除非空约束

alter table TML 
modify TML_id  int null;    //可以为空
modify TML_name varchar(255)  default   'aaa'  null;

唯一约束UNIQUE

可以用于保证某列或者指定列组合不出现重复值,但可以出现多个null值唯一约束既可以进行列级唯一约束,也可以进行表级唯一约束。如果只是为一列建立唯一约束那么只需要用列级,该唯一约束默认与列同名,并且会创建唯一索引。如果要为多列建立唯一约束或者是想自行制定约束名,那么需要使用表级唯一约束。

创建表时增加唯一约束

列级唯一约束

create table tml
    tml_id int not null,
      tml_name varchar(255) unique
  );

表级唯一约束

creat table tml
( 
  tml_id int not null,
  tml_name   varchar(255),
  tml_gender  varchar(255),
  unique (tml_name),               //使用表级约束语法建立唯一约束,李明这个名字在该姓名列必须只出现一次
  constraint  tml_nb  unique(tml_gender)   //使用表级唯一约束建立约束并且给该约束命名,两个属性各自都具有唯一性
)

指定两列的组合不允许出现重复,即两个属性不能完全相同(15,李明),(16,李明)也可以

creat table tml
(
  tml_id int not null,
  tml_name   varchar(255),
  tml_gender  varchar(255),
  constraint tml_verynb unique(tml_id,tml_name) 
)

修改表时增加唯一约束

修改表时用add创建一个表级唯一约束

alter table tml
add unique (tml_name,tml_id);

修改表时用modify创建一个列级唯一约束

alter table tml
modify tml_name varchar(255) unique;

删除唯一约束

alter table tml
drop index tml_nb;     //直接删除约束名

主键约束 PRIMARY KEY

主键约束相当于非空约束加唯一约束,主键约束的列既不能出现重复值,也不能出现null值,如果是多列组合的主键则要求每一列都不能有null值,但对于唯一性约束则只是要求其组合满足唯一约束条件。主键约束既可以用列级约束也可以用表级约束,但无论用户对约束做怎样的命名,主键约束名最终都是PRIMARY

建表时建立主键约束

建立列级主键约束

create table tml
(
  tml_id int primary key,
  tml_name varchar(255) 
);

建立表级主键约束

create table tml
(
  tml_id int not null,
  tml_name varchar(255),
  tml_gender  varchar(255),
  constraint tml_nb primary key(tml_id)  //指定主键约束名对大多数数据库有效,但对mysql无效
);

建立表级组合主键约束

create table tml
(
  tml_id int not null,
  tml_name varchar(255),
  tml_gender  varchar(255),
  primary key(tml_id,tml_name)//指定为主键约束后即使单个列没有非空约束也会自动具有非空约束
) ;

修改表时建立主键约束

建立列级主键约束

alter table tml
modify tml_id int primary key;

建立表级主键约束

alter table tml
add  primary key(tml_id,tml_name);
//删除主键约束
alter table tml
drop primary key;

设置自增长主键约束

自增长主键要求主键列数据类型必须为整型,通常用于设置逻辑主键列(没有任何物理信息,仅用于标识每行记录),向该表插入记录时,可以不为该列指定值,该主键列的值由数据库自动生成

create table tml
  tml_id int auto_increament primary key,
  tml_name varchar(255),
  tml_pass varchar(255)
);

外键约束FOREIGN KEY

外键是构建于一个表的两个字段或者两个表的两个字段之间的参照关系,主表是存放被参照对象的表,从表是存放外键列的表

  • 从表外键列的值必须在主表被参照列的值范围之内,或者为空。
  • 外键约束通常定义于两个实体之间一对多(多的一端增加外键列),一个老师对多个学生,在学生实体上添加外键列
  • 当主表记录被从表参照时,主表记录不允许被删除,必须先把从表里该主表外键列全部删除才可以,除非在删除主表时级联删除从表所有信息
  • 一对一的关系,可以选择任意一方当作外键列
  • 多对多的关系,需要额外增加一个连接表记录他们的关联关系
  • 从表外键参照的只能是主表的主键列或者是唯一键列(索引)

以上就是外键约束的一些基本术语。

建表时建立外键约束

采用列级约束语法建立外键约束 ,为保证主表存在,必须先建立主表

create  table tml(主表)
(
  tml_id int auto_increment primary key,
  tml_name varchar(255) not null,
);
creat table student(从表)
(
  stu_id int auto_increment primary key,
  stu_name varchar(255),
  #指定java_tml 参照到tml_id列
  java_tml int references tml_table(tml_id)
);   //这种外键约束建立方法并没有什么用,仅仅是为了mysql保持兼容性而已

创建外键时如果没有指定名字,则默认名为table_name_ibfk_n,table_name 是从表的表名

create  table tml(主表)
(
  tml_id int auto_increment primary key,
  tml_name varchar(255) not null,
);
creat table student(从表)
(
  stu_id int auto_increment primary key,
  stu_name varchar(255),
  #指定java_tml 参照到tml_id列
  java_tml int ,
  foreign  key  (java_tml)  references  tml_table (tml_id) 
);

表级语法显式的指定外键约束的名字

create  table tml(主表)
(
  tml_id int auto_increment primary key,
  tml_name varchar(255) not null,
);
creat table student(从表)
(
  stu_id int auto_increment primary key,
  stu_name varchar(255),
  #指定java_tml 参照到tml_id列
  java_tml int ,
  constraint   student_tml_fk   foreign   key   (java_tml)   references   tml_table  (tml_id) //为外键约束指定名称
);

采用表级语法建立多列组合的外键

create  table tml(主表)
(
  tml_id int ,
  tml_name varchar(255) not null,
  primary key(tml_id,tml_name)  //首先在主表里建立联合主键
);
creat table student(从表)
(
  stu_id int auto_increment primary key,
  stu_name varchar(255),
  #指定java_tml 参照到tml_id列
  java_tml int ,
  java_tml_id   int ,
  constraint   student_tml_fk   foreign   key   (java_tml_name,java_tml_id)   references   tml_table  (tml_id,tml_id)
);

修改表时建立外键约束

不能使用列级,只能使用表级,你想啊,是添加了一个字段,约束给之前没有的字段往哪儿填去

alter table tml
add foreign key (java_tml_id,java_tml_name) references tml_table(tml_id,tml_name);

建立自关联的外键约束

例如员工分经理和普通员工一样

create table person
  person_id  int auto_increment primary key,
  person_name varchar(255),
  #本表的refer_id列参照到本表的person_id 列
  refer_id int,
  foreign  key ( refer_id) references  person_table(person_id)
);

删除外键约束

只删除从表的外键约束

alter table tml
 drop foreign key  student_tml_fk:    //删除其约束名即可

定义删除主表时级联删除从表外键或将其外键设置为null

create  table tml(主表)
(
  teacher_id int ,
  tml_name varchar(255) not null,
  primary key(teacher_id )  
);
creat table student(从表)
(
  stu_id int auto_increment primary key,
  stu_name varchar(255),
  #指定java_tml 参照到tml_id列
  java_teacher int ,
   //定义级联删除,或者可以on delete set null把从表记录设置为空
  foreign key (java_teacher) references  teacher_table(teacher_id ) on delete cascade  
);

CHECK约束

通常来说check约束使用场景并不多

create table check
(
  check_id int auto_increment,
  check_name varchar(255),
  check_salary decimal,
  primary key (check_id),
  #建立check约束
  check(check_salary>0)
);

完整性约束

在关系模型中,关系完整性主要是指以下三方面:

  • 实体完整性,所谓的实体完整性就是指关系(所谓的关系就是表)的主码不能取空值; 比如学生表的主码通常是取学号为主码
  • 参照完整性,是指参照关系中每个元素的外码要么为空(NULL),要么等于被参照关系中某个元素的主码;, 参照关系也称为外键表,被参照关系也称为主键表。
  • 用户定义的完整性指对关系中每个属性的取值作一个限制(或称为约束)的具体定义。比如 性别属性只能取”男“或”女“ ,再就是年龄的取值范围,可以取值0-130 ,但不能取负数,因为年龄不可能是负数。

常用的就是实体完整性和参照完整性,分别由主键约束外键约束解决,用户定义完整性由check约束解决。

数据库索引

索引是存放在模式中的一个数据库对象,从属于数据表,作用是加速对表的查询(通过快速路径访问来访问数据,减少磁盘的I/O)索引在数据字典里独立存放,但不能独立存在,必须从属于某个数据表。索引有自动创建的也有手动创建的

  • 自动:当表上定义foreign keyunique, primary key时,系统会自动为其创建索引,当数据表被删除时索引自动被删除
  • 手动用户通过create index….语句创建索引,通过drop index….语句删除索引

以下为索引操作的语法

#创建表tml基于字段tml_id的查询速度
create index tml_tml_id_idx     //注意命名规范
on tml(tml_id);
#同时对多列创建索引
create  index tml_tml_id_idx2
on  tml(tml_id,tml_name);
#删除tml表上tml_tml_id_idx2 索引
drop index  tml_tml_id_idx2
on tml;  //mysql只要求本表内索引不重名,所以建立索引时必须指定表

数据库视图

视图并非数据表,不能存储数据,只是数据的逻辑显示,所谓视图就是一条被命名的SQL查询语句

#创建视图的语法
create or replace  view 视图名
as
subquery

如果该视图不存在,则创建视图,如果存在,则使用新视图替换已有,后面的subquery就是一个查询语句

#创建视图,通常对视图的操作仅限于查询,没有修改
create  or  replace view view_test
as
select  teacher_name  ,teacher_pass  from  teacher_table
with check option;         //强制要求不能对该视图进行修改
#删除视图
drop  view  view_test


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
4月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
257 0
|
6月前
|
SQL 存储 关系型数据库
菜鸟之路Day29一一MySQL之DDL
本文《菜鸟之路Day29——MySQL之DDL》由作者blue于2025年5月2日撰写,主要介绍了MySQL中的数据定义语言(DDL)。文章详细讲解了DDL在数据库和表操作中的应用,包括数据库的查询、创建、使用与删除,以及表的创建、修改与删除。同时,文章还深入探讨了字段约束(如主键、外键、非空等)、常见数据类型(数值、字符串、日期时间类型)及表结构的查询与调整方法。通过示例代码,读者可以更好地理解并实践MySQL中DDL的相关操作。
232 11
|
3月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
313 10
|
2月前
|
SQL 数据管理 BI
数据库操作三基石:DDL、DML、DQL 技术入门指南
本文围绕数据库操作核心语言 DDL、DML、DQL 展开入门讲解。DDL 作为 “结构建筑师”,通过CREATE(建库 / 表)、ALTER(修改表)、DROP(删除)等命令定义数据库结构;DML 作为 “数据管理员”,以INSERT(插入)、UPDATE(更新)、DELETE(删除)操作数据表记录,需搭配WHERE条件避免误操作;DQL 作为 “数据检索师”,通过SELECT结合WHERE、ORDER BY、LIMIT等子句实现数据查询与统计。三者相辅相成,是数据库操作的基础,使用时需注意 DDL 的不可撤销性、DML 的条件约束及 DQL 的效率优化,为数据库学习与实践奠定基础。
|
7月前
|
SQL 人工智能 数据可视化
16.1k star! 只需要DDL就能一键生成数据库关系图!开源神器ChartDB让你的数据结构"看得见"
ChartDB是一款开源的数据库可视化神器,通过一句智能查询就能自动生成专业的数据库关系图。无需安装客户端、不用暴露数据库密码,打开网页就能完成从数据建模到迁移的全流程操作,堪称开发者的"数据库透视镜"。
1554 67
|
4月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
133 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL 5.6/5.7 DDL 失败残留文件清理指南
通过本文的指南,您可以更安全地处理 MySQL 5.6 和 5.7 版本中 DDL 失败后的残留文件,有效避免数据丢失和数据库不一致的问题。
|
5月前
|
SQL 存储 关系型数据库
一、数据库和表的基本操作 DDL
在使用 MySQL 做项目或写业务逻辑时,离不开对数据库和数据表的基本操作。我们这次从创建数据库讲起,一步步带你掌握如何新建表、查看表结构、修改字段、重命名、删除等常用命令。每一个知识点都有示例代码可直接上手,还准备了一套完整的动手练习,帮助你把概念变成熟练技能。如果你刚入门 SQL,或者想系统梳理一遍 DDL 基础,这篇会是不错的起点。
370 1
|
7月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
341 28

推荐镜像

更多