mysql字段修饰符

117 阅读5分钟

数据类型是限定数据的,而修饰符则是限定字段变量的。

unsigned:无符号

auto_increment:自增

default:默认,即没有插入字段时显示成什么

comment:字段解释说明

null:空

not null:非空,案例中,要设置所有的字段均为非空

unique:唯一索引

index:普通索引

primary key:主键,主键必须是自增auto_increment的,一般用变量ID来表示主键

**索引的作用:相当于目录,方便查找数据,稳准快。

(1).null和not null

not null不可以插入null,但可以插入空值。

数值型、字符型、日期型都可以插入null,但只有字符型可以插入空值。

空值与null的区别:空值不占用空间,但null占用空间(计算1字节)

not null比null的效率高。这是因为null不是空值,占用空间,所以进行字段比较时,null会参与字段比较,对效率有一部分影响。而且索引不会存储null值,索引的效率会下降很多。

(4).扩展:清除表数据,包括auto_increment值

一般情况下,删除表数据会使用delete命令,但是delete是没有办法清除auto_increment值的。如下:

SQL语句:delete from test_table; 自增值任然保留着之前的数值,当我们新增一条数据时会发现自增不是从1开始的。

注意:truncate会清除表的所有数据。如果只想清除auto_increment值,不要使用该命令。

SQL语句:truncate table test_table;

(5).扩展

其实除了以上几个,还存在检查约束、外键约束、主键约束和唯一约束,而主键约束和唯一约束也是索引。

not null

有not null 来修饰的话,往表里添加默认值的时候:

数值类型的话,添加的是0

字符串类型的话,添加的是空

如果数据类型是时间戳类型,添加的默认值是当前时间

枚举类型,添加的是第一个预先定义的值

default

default修饰符为字段指定一个默认值

auto_increment

auto_increment修饰符只适用于INT字段,表明MySQL应该自动为该字段生成一个数(每次在前一个值得基础上加1)。

MySQL的表只能有一个auto_increment 字段,而且这个字段必须被定义为键。

unique 表示记录不能重复,unique字段null是允许的

设置unique属性的两种方法:

> create table t10(name char(10),email varchar(20) unique);

> create table t11(id int,name char(10),unique(id));

删除unique

> alter table user drop index email;

索引

MUL

为了加快搜索速度,减少查询时间, MySQL允许我们为一个表的特定字段设置索引

索引的缺点:它占据一定的磁盘空间,而且它影响INSERT,UPDATE和DELETE执行的时间

添加索引

> create table sales(name char(4),price float(4,2),date date,index name_index(name)); // 给字段name添加索引,索引的名称是name_index; 如果没有定义索引名称,则使用字段名称做为索引的名称

查看索引

> show index from sales;

为多个字段添加索引

> create table sales2(name char(4),price float(4,2),date date,index name_index(name),index (price));

> create table sales3(name char(4),price float(4,2),date date,index (name,price));

使用create index命令向已存在的表添加索引

> create index id_index on xueke (id);

删除索引

> drop index id_index on xueke;

主键

primary key

设置主键的几种方法:

> create table pri(id tinyint not null unique,name char(10)); // not null unique

> create table pri(id tinyint primary key,name char(10));

> create table pri(id tinyint,name char(10),primary key(id));

组合主键

> create table firewall(host varchar(20),port smallint(4),access enum('deny','allow'),primary key(host,port));

> insert into firewall values('192.168.10.1',21,'deny');

> insert into firewall values('192.168.10.1',80,'deny');

> insert into firewall values('192.168.10.2',80,'deny');

> insert into firewall values('192.168.10.2',80,'deny');

Duplicate entry '192.168.10.2-80' for key 1

在这种情况下,允许host或者port重复,但不能同时重复

外键

建立外键:

foreign key...references...

> create table score (id int,name char(10) primary key,math int,phy int) type=innodb;

> create table addr (id int primary key,aname char(10) not null,addr char(255),tel int,index (aname),foreign key (aname) references score (name)) type=innodb;

约束:

1. 关系中的所有表必须是InnoDB表

2. 参照的表和字段(必须是primary key,否则会出MySQL - errno:150的错误)是存在 的

3. 组成外键的字段被索引

4. 在外键关系中,字段的数据类型必须相似,这对于大小和符号都必须匹配的整数类型及其重要

一旦建立一个外键,MySQL只允许向addr.aname字段输入那些也存在于score.name字段的值

删除外键:

1. 删除有外键的表

> drop table addr;

Query OK, 0 rows affected (0.00 sec)

2. 从表中删除外键

语法:

alter table 表名 drop foreign key 外键名;

show create table 表名;

实验结果 Mysql会报错:

> alter table addr drop foreign key aname;

ERROR 1025 (HY000): Error on rename of './db1/addr' to './db1/#sql2-5258-7' (errno: 152)

on delete cascade子句

cascade删除包含与已删除键值有参照关系的所有记录

建表

> create table score (id int,name char(10) primary key,math int) type=innodb;

> create table addr (id int primary key,aname char(10),addr char(255),tel int,index (aname),foreign key (aname) references score (name) on delete cascade) type=innodb;

【on delete cascade】表示删除的时候不做任何处理

删除score表中Hebe的记录,addr表中Hebe的记录自动删除