mysql数据库-1-2-基础-约束
约束
外键约束
1,创建表时,同时创建外键约束
CREATE TABLE IF NOT EXISTS dept (
did int not null auto_increment PRIMARY KEY,
dname VARCHAR(50) not null COMMENT '部门名称'
)ENGINE=INNODB DEFAULT charset utf8;
CREATE TABLE IF NOT EXISTS person(
id int not null auto_increment PRIMARY KEY,
name VARCHAR(50) not null,
age TINYINT(4) null DEFAULT 0,
sex enum('男','女','人妖') NOT NULL DEFAULT '人妖',
salary decimal(10,2) NULL DEFAULT '250.00',
hire_date date NOT NULL,
dept_id int(11) DEFAULT NULL,
CONSTRAINT fk_did FOREIGN KEY(dept_id) REFERENCES dept(did) -- 添加外键约束
)ENGINE = INNODB DEFAULT charset utf8;
2,已经创建表后,追加外键约束
#添加外键约束
ALTER table person add constraint fk_did FOREIGN key(dept_id) REFERENCES dept(did);,
#删除外键约束
ALTER TABLE person drop FOREIGN key fk_did;
注:插入数据时,先插入主表中的数据,再插入从表中的数据。
删除数据时,先删除从表中的数据,再删除主表中的数据。
外键的优点
一、数据一致性
由数据库自身保证数据一致性、完整性会更可靠,程序很难100%保证数据的一致性、完整性
二、ER图可靠性
有主外键的数据库设计可以增加ER图的可读性
外键的缺点
一、级联问题
阿里巴巴的开发手册中,就曾指出强制要求不允许使用外键,一切外键概念必须在应用层解决。 因为每次级联delete或update的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈
二、增加数据库压力
外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源
三、死锁问题
若是高并发大流量事务场景,使用外键还可能容易造成死锁
四、开发不方便
有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素
总结
一、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键
二、如果为了高并发,分布式,使系统性能更优,以及更好维护,则一定不能使用外键
非空约束
关键字: NOT NULL ,表示 不可空. 用来约束表中的字段列
create table t1(
id int(10) not null primary key,
name varchar(100) null
);
主键约束
用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。
create table t2(
id int(10) not null primary key
);
注意: 主键这一行的数据不能重复且不能为空。
唯一约束
关键字: UNIQUE, 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
create table t4(
id int(10) not null,
name varchar(255) ,
unique id_name(id,name)
);
//添加唯一约束
alter table t4 add unique id_name(id,name);
//删除唯一约束
alter table t4 drop index id_name;
默认值约束
关键字: DEFAULT
create table t5(
id int(10) not null primary key,
name varchar(255) default '张三'
);
插入数据
INSERT into t5(id) VALUES(1),(2);
注意: INSERT语句执行时.,如果被DEFAULT约束的位置没有值,那么这个位置将会被DEFAULT的值填充