1.1、非空约束

  定义:用来定义该键不能为空的约束,在后续插入数据中该值不能为空值
create table roo
(
id int not null,
name char(10) not null
);
create table roo
(
id int null,
name char(10) null
);

//这里和not null相反,这两个列都可以为空,切记null不等于任何值,包括null本身。
  这里我创建了一个名为roo的表,里面有两个列都加上了非空属性的约束,插入数据时,如果为空则会提示错误

1.2、唯一约束

  唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 MySQL会给唯一约束的列上默认创建一个唯一索引;
create table root
(
id int unique,
name char(10) unique
);
  这里的id和name的值都是唯一属性,值时不能相同的。

1.3、默认约束

  定义:默认约束的值在插入数据时如果不给数据则默认为默认约束值
create table root
(
id int default 1,
name char(10) default “wuyu”
);
  这里我设置的默认值为id为1,name的默认值为无语

1.4、自增约束

  定义:定义了自增约束,如果不初始化值,则自动从1开始递增
create table mm
(
id int not null auto_increment,
name char(10) null,
primary key(id)
);
  这里的自增约束auto_increment必须设为主键。

1.5、外键约束

  外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。保持数据的一致性和整体性是他的目的
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
create table student
(
sno int,
sname char(10) not null,
sex char(5) not null,
primary key(sno)
);

//这里创建了一个学生表,用来和另一张表进行连接

create table course
(
sno int,
cno int not null,
score varchar(10) not null,
index(sno), —外键必须加索引
foreign key(sno) references student(sno)
);

//课程表中的id是student表的外键

alter table course drop foreign key sno;//删除表中的外键

alter table course
add foreign key(sno) references student(sno);

alter table course
add constraint FK_SNO
foreign key(sno) references student(sno);

//添加新的外键

alter table course
add constraint FK_SNO
foreign key(sno) reference student(sno)
on update cascade
on delete cascade;

//on update cascade 联级更新
//on delete cascade 联级删除
//作用:这里一旦学生所在表的数据有更新或删除的操作,那么课程所在表也会对应的进行更新和删除的操作
//事件触发器限制:cascade(跟随外键改动),restrict(限制表中的外键改动),set null(设空值),no action(默认)

drop table sc;
drop table student;

//这里为了保证数据的完整性约束,必须先删除成绩表sc,才能删除学生表

1.6、主键约束

  主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
create table ant
(
id int not null,
name char(10) not null,
sex char(10) default “nan”,
score varchar(10),
primary key(id)
);

create table ant
(
id int not null,
name char(10) not null,
sex char(10) default “nan”,
score varchar(10),
primary key(id,name)
);

//你可以使用一列作为主键,也可以使用两列作为主键,称之为符合主键,必须通过两个列的数据才能进行整体定位的表可以使用。

1.7、检查约束

  MySQL可以使用check约束,但check约束对数据验证没有任何作用。 也就是说不符合的数据也可以成功被插入
create table student
(
id int primary key,
name char(10) not null,
age int not null,
check(age>20)
);

//这里虽然加了check约束要求年龄必须大于20,但实际小于20也可以插入。

2.MySQL 索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。


2.1普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:
CREATE INDEX indexName ON table_name (column_name)
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

删除索引的语法

DROP INDEX [indexName] ON mytable;


2.2唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表结构

ALTER table mytable ADD UNIQUE [indexName] (username(length))

创建表的时候直接指定

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length))

);


使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;


2.3使用 ALTER 命令添加和删除主键

主键作用于列上(可以一个列或多个列联合主键),添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。


2.4显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
尝试以下实例:
mysql> SHOW INDEX FROM table_name; \G
……..