MySQL中的DDL和DML

时间:2021-03-01 13:03:20   收藏:0   阅读:0

先看看表中的数据都有一些什么内容。

1.数据类型

表里的数据,都需要有一个确切的数据类型。先来看看表支持哪些数据类型吧?(以下列举常用的)

int、bigint、float、double、char、varchar、date、datetime,BLOB、CLOB

2.约束

约束是为了保证表数据的完整性、有效性和安全性。

就像你注册一个账号时,对你所填的信息是有要求的,比如密码不能为空等等要求。这些在数据库中都是使用约束来完成。

MySQL中有四种约束:

(在下述建表语句中会更详细的介绍约束的用法)

3.创建表及删除表

表是数据库的基本单元,所有的数据都以表的形式创建。

所以我们首先要做的就是创建表:

create table tb_name
(
	字段名 数据类型(长度)[约束] [default],
    ......
)

如:

在创建一张表时,可能数据库已经存在了,所以在创建表前可以先做一个判断(下述第一行)

#删除表
drop table tb_name;
#可以先判断一下是否已经存在表,如果存在就删除原来的
drop table if exists student;
#建表
create table student
(
    stu_no int(5) primary key,
    stu_name varchar(10) not null,
    stu_class int(2) unique,
    stu_sex char(1),
    stu_grade double(4,2)
);

上述创建表,使用了数据类型和关键字。

主键:

为什么需要主键呢?

用于唯一的标识一行数据。如两个相同名字,相同出生年月日,相同性别的人,但是可以使用身份证取唯一的区分两个人。

unique和not null,可同时定义多个字段,primary key只能有一个。但是可以多个字段联合起来作为主键,如primry key(stu_no,stu_name),这种称为复合主键,但是一般不建议这样使用。一个字段的主键称为单一主键,建议使用单一主键。

primary key不仅仅在字段后面使用,也可以在最后使用:

create table student
(
    stu_no int(5),
    stu_name varchar(10) not null,
    stu_class int(2) unique,
    stu_sex char(1),
    stu_grade double(4,2),
    primary key(stu_no)
);

主键的其它点:

主键还可以分为自然主键和业务主键,业务主键是和业务有关系的字段作为主键,如身份证号,银行卡号,但是不建议使用业务主键,因为有时候业务可能会发生改变,主键就需要随之改变,但是很多时候是不能修改的,修改很难避免重复的问题。一般使用自然主键,即自定义一个字段作为主键,来标识一行数据。如1,2,3...这种简单的数字。

自增:

MySQL中支持数据自增,即auto_increment,一般与主键联合在一起使用。如stu_no int(5) primary key auto_increment,以1开始,以1递增(上条数据+1),可修改步长。

unique:

unique也可以放在最后:

create table student
(
    stu_no int(5) primary key auto_increment,
    stu_name varchar(10) not null,
    stu_class int(2) unique,
    stu_idcard int(13) unique,
    stu_sex char(1),
    stu_grade double(4,2)
);

create table student
(
    stu_no int(5) primary key,
    stu_name varchar(10) not null,
    stu_class int(2),
    stu_idcard int(13),
    stu_sex char(1),
    stu_grade double(4,2),
    unique(stu_class,stu_idcard)
);

注意:上述两种创建的唯一约束是不一样的。

外键:

先来看两张表:

student表:

name varchar(10) classNo int(2) sex char(1)
Tom 1
Jerry 2

class表:

class_no int(2) class_name varchar(3)
1 一班
2 二班

在class表中的class_name字段取值取的是student表中的classNo字段中的值,此时,class_name就是外键。

如何定义一个外键呢?(假设student表已经创建好了)

create table class
(
    class_no int(2) primary key auto_increment,		#数据长度必须与引用字段的长度一致
    class_name varchar(3),
    #定义外键
    foreign key(class_no) references student(classNo);
)

注意:

4.表中插入数据

insert into tb_name 字段1,... values (值1,...);
#字段和值必须一一对应;
#如果是自增的值,可以填NULL,那么此时就会在上一条数据基础上+1,也可以指定值。

#可以省略指定的字段不写,即代表所有的字段
insert into tb_name values (值1,...);

#也可同时插入多个值
insert into tb_name 字段1,... values (值1,...),(值1,...),...;

默认值:

有些数据可能在一开始就设置了默认值,如:

class_name int(3) default ‘一班‘

创建表时,如果指定了默认值,插入数据就算没有指定该值,也会自动的生成默认值。但是可以重新复制,覆盖默认值。

表的复制:

可以使用insert+select实现表的复制:

insert into new_tb_name as (select * from old_tb_name);

(但是必须要保证两张表的字段个数是一样的)

5.更新表中数据

update tb_name set 字段1 = 值1,... [where 条件];
#如果没有条件的话,会修改整张表中的数据,一定要注意添加条件,修改了是不可逆的。

6.删除数据

delete from tb_name [where 条件];
##如果没有条件,会删除整张表,更加要谨慎了!!!

如果是一张很大的表,delete的执行效率是很慢的,可能好好多分钟,因为delete是不会释放表真正的空间的。

还有另外一个删除:truncate:

truncate table tb_name;

truncate删除一张表,会永久的截断,不可恢复丢失的数据。(慎用!)


该文章中没有涉及到DML中的alter,因为在实际开发中,一张表设计好了,很少会修改表的结构,为了减负,就不在此赘述了。

可以直接百度MySQL的alter命令。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!