Mysql数据库(下)——数据的完整性以及各种约束的使用

本篇对数据库基本用法中的各种约束进行总结,如果想快速去实习的话,基本学到这就可以了,后面根据公司的要求,需要进一步去学习后面的知识,索引以及锁的使用等,这些还是比较重要的;以下代码可以直接粘贴到数据库可视化软件中,方便理解和练习;
#约束:

/*约束就是对表中的字段的限制;
约束的分类:
约束的字段个数:单列约束和多列约束
约束的作用范围:列级约束和表级约束
约束的功能:非空约束,唯一性约束,主键约束,外键约束,检查约束,默认值约束;
如何添加约束:
create table时添加约束,alter table时可以添加约束删除约束;
*/
#如何查看约束:
SELECT *FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_NAME='employees';
#not null约束:
CREATE TABLE myempl2(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salar DECIMAL(10,2)
);
DESC myempl2;
INSERT INTO myempl2
VALUES(1,'tom','[email protected]',5000);
#报错:last_name不能为null
INSERT INTO myempl2
VALUES(1,NULL,'[email protected]',5000);
#修改时添加非空约束:
ALTER TABLE myempl2
MODIFY email VARCHAR(25) NOT NULL;
DESC myempl2;
#删除非空约束:
ALTER TABLE myempl2
MODIFY email VARCHAR(25) NULL;
#唯一性约束:在创建唯一性约束的时候,如果不给命名,那么该约束名称跟列名一样;属性为unique约束的,可以多次添加null值的;
DROP TABLE myempl2;
CREATE TABLE myempl2(
id INT UNIQUE,#列级约束,添加到属性的后面;
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
#表级约束:
CONSTRAINT uq_myempl2 UNIQUE(email)
);
#复合型唯一性约束:同时对多个属性添加唯一性约束
DROP TABLE myempl2;
CREATE TABLE myempl2(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
CONSTRAINT uq_myempl2_dou UNIQUE(id,last_name));
#下面这两条数据都可以添加进去,可知,复合型的是两个属性都是一样的才不能添加进去;
INSERT INTO myempl2 VALUES(1,'tom',5000),(1,'jerry',6000);
#删除唯一性约束:
/*首先在添加唯一约束的列上会自动创建一个唯一索引,
删除唯一约束只能通过删除唯一索引的方式删除,删除时需要指定唯一索引的名字,名字就是唯一约束的名字;
*/
SELECT*FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_NAME='myempl2';
ALTER TABLE myempl2
MODIFY salary DECIMAL(10,2) UNIQUE;
ALTER TABLE myempl2
DROP INDEX salary;
ALTER TABLE myempl2
DROP INDEX uq_myempl2_dou;
#主键约束:相当于唯一性约束和非空约束的组合(非空且唯一);一个表中只能有一个主键约束;
DROP TABLE myempl2;
CREATE TABLE myempl2(
id INT PRIMARY KEY,#列级约束
last_name VARCHAR(15),
salary DECIMAL(10,2));
DESC myempl2;
DROP TABLE myempl2;
CREATE TABLE myempl2(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
PRIMARY KEY(id)#表级约束
);
#auto_increment 一般用于主键上,用于自增长,一个表只能有一个自增长的列;
DROP TABLE myempl2;
CREATE TABLE myempl2(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15),
salary DECIMAL(10,2));
INSERT INTO myempl2(last_name) 
VALUES('tom'),('jerry');
#可以看到id自增加;
SELECT *FROM myempl2;
#外键:首先要有主表和从表,然后从表依赖主表,需要先创建主表,才能创建从表,删除的时候需要先删除从表,
#然后再删除主表;并且依赖的那个属性需要是唯一性的;
#先创建主表:
CREATE TABLE dept1(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15));
#从表:
CREATE TABLE emp1(
emp_id INT,
emp_name VARCHAR(15),
department_id INT,
CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id)REFERENCES dept1(dept_id)#这里department_id和dept_id可以不用相同但是类型必须相同;
);
#插入数据失败,因为主表dept1中没有对应的dept_id
INSERT INTO emp1 VALUES(1001,'tom',10);

INSERT INTO dept1 VALUES(10,'jerry');
#插入成功:
INSERT INTO emp1 VALUES(1001,'tom',10);
#实际开发过程中一般不使用外键,在应用层进行设置,高并发类型的使用外键可能会导致更新风暴,插入效率低等影响;
DROP TABLE myempl2,myempll;

你可能感兴趣的:(mysql,java,学习,开发语言,oracle,后端,数据库)