五:约束

1.约束

为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效。

约束条件与数据类型的宽度一样,都是可选参数

作用:用于保证数据的完整性和一致性

主要分:

PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)    标识该字段为该表的外键
NOT NULL    标识该字段不能为空
UNIQUE KEY (UK)    标识该字段的值是唯一的
AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT    为该字段设置默认值

UNSIGNED 无符号
ZEROFILL 使用0填充
1. 是否允许为空,默认NULL.可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

2.nou null和default

一般二者是连用的,不允许为空,当没有传的时候就用默认值填充.

是否可空,null表示空,非字符串
not null - 不可空
null - 可空


默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table tb1(
nid int not null defalut 2,
num int not null
)

3.unique

唯一约束,指定某列或者几列组合非空不能重复

mysql认为null不是重复的,所以当你需要制定某字段非空且唯一时,not null unique

例如用户名不能重复

联合唯一

扫描二维码关注公众号,回复: 7340837 查看本文章
create table service(
id int primary key auto_increment,
name varchar(20),
host varchar(15) not null,
port int not null,
unique(host,port) #联合唯一
);

mysql> insert into service values
    -> (1,'nginx','192.168.0.10',80),
    -> (2,'haproxy','192.168.0.20',80),
    -> (3,'mysql','192.168.0.30',3306)
    -> ;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into service(name,host,port) values('nginx','192.168.0.10',80);
ERROR 1062 (23000): Duplicate entry '192.168.0.10-80' for key 'host'
create table user_tb(
     id int,
     username varchar(32) not null,
     num int not null,
     unique(username,num)
     );

这里unique key 'username' ("username","num")

括号外面的username,表示联合约束加在了username上

姓名可以重复,但是姓名和学号不能重复.

4.primary key

一张表只能有一个主键,id int primary_key auto_increment,这是99%的使用方式

一张表可以没有主键,记得一次面试问过这个问题,我答的是必须有主键,面试官一脸傲娇的说不一定非有主键

但是你表不设置主键?外键也问一堆,一看就是公司不行,直接走了,整了一个数据库单玩呗,过家家啊.

外键在生产中你设置了就是给自己找麻烦,千万不要让数据库来繁重的工作,可以在上层中解决的问题,不要把请求打到数据库,可以在redis缓存中解决的问题也不要把请求打到数据库.

一旦表设置了外键,向分布式迁移的时候,涉及分库分表,难搞的要死.

虽然是学数据库,但是尽可能在逻辑层把问题解决,一旦需求变了,只改逻辑层,不动数据库的表结构.

尤其是数据量非常大的时候.

因为我们人是活的,思维是活的,数据库就是一个死干活的,它只知道你让它这么干,但是它干的慢,后面那么多请求阻塞着呢!

联合主键

很少见

create table user_tb(
  id int,
   username varchar(32) not null,
   num int not null,
   primary key(username,num)
   );
View Code

5. auto_increment

只能用在数字类型上且必须是唯一的,因此常和主键一起使用,由Mysql自动帮你维护id字段

你只关心核心的数据

6.foreign key

几乎不用,稍微看看

涉及多张表,加在数据多的表中,想要删除有外键表的记录

外键一般是关联外表的主键,因为上面有索引

猜你喜欢

转载自www.cnblogs.com/gyxpy/p/11571556.html