约束 表关系 建表原则 多表查询 事务
添加约束可以在添加数据的时候就限制不正确的数据,年龄是300,数学成绩是-5分这样无效的数据,继而保障数据的完整性。
非空约束 NOT NULL **唯一UNIQUE** --id列非空不能重复 AUTO_INCREMENT: 当不指定值时自动增长
主键PRIMARY KEY要求非空且唯一=notnull=唯一UNIQUE,一张表只能有一个主键
外键 FOREIGN KEY让两个表的数据之间建立链接
一般会给每张表添加一个主键列用来唯一标识数据
检查 CHECK保证列中的值满足某一条件 17<age<58
注意MySQL不支持检查约束但可以在java代码中进行限制
默认DEFAULT保存数据时,未指定值则采用默认值
默认时才会采用默认值。如果给了null,那值就是null值。
-- 员工表
DROP TABLE IF EXISTS emp;
[CONSTRAINT] [约束名称] UNIQUE(列名)/ [CONSTRAINT] [约束名称] PRIMARY KEY(列名) );
CREATE TABLE 表名(
列名 数据类型,
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
-- 建完表后添加非空约束 ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL/UNIQUE;
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
-删除约束 ALTER TABLE 表名 DROP INDEX 字段名 DROP PRIMARY KEY 外键名称;
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
-- 员工表
CREATE TABLE tb_emp(列名 数据类型
id int primary key auto_increment,
name varchar(20),
age int,
ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
salary DECIMAL(7,2) NOT NULL , -- 工资,非空
bonus DECIMAL(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
dep_id int,
payment_type TINYINT,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES tb_dept(id) 一对多
--关联dept 表的id主键
FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键,关联部门表(部门表的主键)多表查询
);
-- 建完多对多表后,添加外键
建立第三张中间表,中间表至少包含两个外键,分别关联两方主键==
alter table emp表名 add CONSTRAINT fk_emp_dept外键名称 FOREIGN key(dep_id外键字段名称) REFERENCES dept主表名称(id主表列名称);
tb_order_goods---fk_order--fk_goods
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);
多表查询
内连接查询
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;虚拟表
- 子查询语句使用 = != > < 等进行条件判断,多行单列使用 in
select dept_id, count(*) from emp 别名left join/RIGHT [OUTER] JOIN 表2 group by dept_id;in ( )
inner join job ON emp.job_id = job.id
WHERE emp.salary >= t2.losalary AND emp.salary <= t2.hisalary
where+or where name = '猪八戒'
inner join salarygrade t2 ON emp.salary BETWEEN t2.losalary and t2.hisalary;
-- 开启事务
BEGIN;或者START TRANSACTION;
-- 转账操作
-- 1. 查询李四账户金额是否大于500
UPDATE account set money = money - 500 where name = '李四';
出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
查询默认提交方式SELECT @@autocommit;
set @@autocommit = 0;手动提交=1自动提交