MySQL系列(三)之约束条件

约束 : 对编辑的数据进行类型的限制, 不满足约束条件的报错

unsigned   :    无符号
not null   :    不为空
zerofill   :    零填充
default    :    默认值
unique     :    唯一值,加入唯一索引 (索引相当于字典目录,索引的提出是为了加快速度,一味地乱加索引不会提高查询效率)
primary key:    主键
auto_increment: 自增加一
foreign key:    外键

unsigned 无符号

create table t1(id int unsigned);
insert into t1 values(-1);  # error
insert into t1 values(4000000000);  # success

not null : 不为空

create table t2(
	id int not null,
	name varchar(11)
);
insert into t2 values(1,"steven");
insert into t2 values(null,"steven");  # error
insert into t2(name) values("steven");  # error

zerofill : 零填充 (配合int使用,不够5位拿0来填充)

create table t3(id int(5) zerofill);
insert into t3 values(1234567);
insert into t3 values(12);

default : 默认值

create table t4(
	id int,
    name char(16),
    gender enum('male','female','others') default 'male'
);
insert into t4(id,name) values(1,'steven');
insert into t4 values(2,'kevin','female');

unique : 唯一值

# 单列唯一
create table t5(
	id int unique,
    name char(16)
);
insert into t5 values(1,'steven'),(1,'kevin');  报错
insert into t5 values(1,'steven'),(2,'kevin');  
	
# 联合唯一
"""
ip和port
单个都可以重复 但是加载一起必须是唯一的
"""
create table t6(
	id int,
    ip char(16),
    port int,
    unique(ip,port)
);
insert into t6 values(1,'127.0.0.1',8080);
insert into t6 values(2,'127.0.0.1',8081);
insert into t6 values(3,'127.0.0.2',8080);
insert into t6 values(4,'127.0.0.1',8080);  报错

primary key : 主键

1.单单从约束效果上来看primary key等价于not null + unique, 非空且唯一!!!

create table t7(id int primary key);
insert into t7 values(null);  报错
insert into t7 values(1),(1);  报错
insert into t7 values(1),(2); 

2.它除了有约束效果之外 它还是Innodb存储引擎组织数据的依据
Innodb存储引擎在创建表的时候必须要有primary key
因为它类似于书的目录 能够帮助提示查询效率并且也是建表的依据

# 1 一张表中有且只有一个主键 如果你没有设置主键 那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级为主键
create table t8(
	id int,
    name char(16),
    age int not null unique,
    addr char(32) not null unique
);

# 2 如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键,
# 隐藏意味着你无法使用到它 就无法提示查询速度

# 3 一张表中通常都应该有一个主键字段 并且通常将id/uid/sid字段作为主键
# 单个字段主键
create table t9(
    id int primary key
	name char(16)
);

# 联合主键(多个字段联合起来作为表的主键 本质还是一个主键)
create table t10(
    ip char(16),
    port int,
    primary key(ip,port)
);

注: 也意味着 以后我们在创建表的时候id字段一定要加primary key

auto_increment : 自增

# 当编号特别多的时候 人为的去维护太麻烦
create table t11(
	id int primary key auto_increment,
    name char(16)
);
insert into t11(name) values('steven'),('kevin'),('jack');

# 注意auto_increment通常都是加在主键上的 不能给普通字段加
create table t12(
	id int primary key auto_increment,
    name char(16),
    cid int auto_increment
);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

注:
以后在创建表的id(数据的唯一标识id、uid、sid)字段的时候
id int primary key auto_increment

delete from t1  # 删除表中数据后 主键的自增不会停止
truncate t1  # 清空表数据并且重置主键
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值