mysql2

29 阅读3分钟

约束 表关系 建表原则 多表查询 事务

添加约束可以在添加数据的时候就限制不正确的数据,年龄是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] JOIN2   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自动提交

事务