MariaDB
存储引擎
mysql配置文件
My.ini
临时缓存目录
undo日志,redo日志放到临时目录。
错误日志配置文件路径
/usr/local/mysql/data/error.log
开启慢查询
slow_query_log = true
记录查询慢的sql语句
超时查询记录
long_query_log = 1
慢查询日志文件
/usr/local/mysql/dataslow_query_log.log
数据库表设计
E-R模型
- 实体-关系模型,由实体、属性、关系三个构成。
- 一对一、一对多、多对多。
- 一对多,单向关联,一般情况下多的一方维护关系,俗称单相思
- 多对多,两方都不维护,由中间表进行维护,转化成两个多对一
- 一对一,谁都可以维护关系
五大约束
- 主键,非空且唯一,可以多个字段复合主键
- 外键,A表中的字段a对应B表的主键b,称为外键
- 唯一,可空唯一,空的只能有一个
- 检查,是否在这一范围
- 默认,默认值
- 非空,不允许空
数据类型
- 数值类型
MySQL数据库中金额字段采用DECIMAL数据类型,固定小数位
Java BigDecimal详解 - 日期类型
- 字符串类型
ENUM 枚举类型 (天气四个季节)
SET 集合类型 (订单状态)
char 定长字符串类型 不够补空格
varchar 可变字符串类型
数据库操作
创建表
CREATE TABLE语句创建表,语法结构如下:
create table 表名(
字段名1 数据类型 [约束条件],
…
[其他约束条件],
[其他约束条件]
)其他选项(例如存储引擎、字符集等选项)
复制表
CREATE table copy_emp like emp
CREATE table copy_emp select * from emp
删除表
drop table emp
修改表
ALTER TABLE 表名 ADD 列名 数据类型和长度 列属性
ALTER TABLE 表名 MODIFY 列名 新数据类型和长度 新列属性
ALTER TABLE 表名 DROP COLUMN 列名
修改约束条件
alter table 表名 add constraint 约束名 约束类型 (字段名)
删除约束条件
删除表的主键约束条件语法格式比较简单,语法格式如下。
alter table 表名 drop primary key
删除表的外键约束时,需指定外键约束名称,语法格式如下(注意需指定外键约束名)。
alter table 表名 drop foreign key 约束名
删除表字段的唯一性约束,实际上只需删除该字段的唯一性索引即可,语法格式如下(注意需指定唯一性索引的索引名)。
alter table 表名 drop index 索引名;
alter table copy_emp add foreign key (deptno) references copy_dept(deptno);
alter table copy_dept add primary key(deptno);
作业1
-- ----------------------------
-- 题目1
-- 1.创建表date_test,包含列d,类型为date型。试向date_test表中插入两条记录,一条当前系统日期记录,一条记录为“1998-08-18”。
-- ----------------------------
CREATE TABLE `date_test` (
`d` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `date_test` VALUES ('1998-08-18 19:30:24');
INSERT INTO `date_test` VALUES ('2021-09-06 14:30:48');
-- ----------------------------
-- 题目2
-- 2.创建与dept表相同表结构的表dtest,将dept表中部门编号在40之前的信息插入该表。
-- ----------------------------
CREATE TABLE `dtest` (
`DEPTNO` int(2) NOT NULL auto_increment,
`DNAME` varchar(14) default NULL,
`LOC` varchar(13) default NULL,
PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8;
insert into `dtest`(`DEPTNO`,`DNAME`,`LOC`) values (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO');
-- ----------------------------
-- 题目3
-- 3.创建与emp表结构相同的表empl,并将其部门编号为前30号的员工信息复制到empl表
-- ----------------------------
CREATE TABLE `empl` (
`EMPNO` int(4) NOT NULL auto_increment,
`ENAME` varchar(10) default NULL,
`JOB` varchar(9) default NULL,
`MGR` int(4) default NULL,
`HIREDATE` date default NULL,
`SAL` double(7,2) default NULL,
`COMM` double(7,2) default NULL,
`DEPTNO` int(2) default NULL,
PRIMARY KEY (`EMPNO`),
KEY `FK_DEPTNO` (`DEPTNO`),
CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dtest` (`DEPTNO`)
) ENGINE=InnoDB AUTO_INCREMENT=8889 DEFAULT CHARSET=utf8;
insert into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREDATE`,`SAL`,`COMM`,`DEPTNO`) values (7369,'SMITH','CLERK',7902,'1980-12-17',800.00,NULL,20),(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600.00,300.00,30),(7521,'WARD','SALESMAN',7698,'1981-02-22',1250.00,500.00,30),(7566,'JONES','MANAGER',7839,'1981-04-02',2975.00,NULL,20),(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250.00,1400.00,30),(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850.00,NULL,30),(7782,'CLARK','MANAGER',7839,'1981-06-09',2450.00,NULL,10),(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000.00,NULL,20),(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000.00,NULL,10),(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500.00,0.00,30),(7876,'ADAMS','CLERK',7788,'1987-05-23',1100.00,NULL,20),(7900,'JAMES','CLERK',7698,'1981-12-03',950.00,NULL,30),(7902,'FORD','ANALYST',7566,'1981-12-03',3000.00,NULL,20),(7934,'MILLER','CLERK',7782,'1982-01-23',1300.00,NULL,10);
-- ----------------------------
-- 题目4
-- 4.试为学生表student增加一列学生性别gender 默认值 “女”。
-- ----------------------------
CREATE TABLE `student` (
`student_id` int(11) NOT NULL,
`student_no` int(11) DEFAULT NOT NULL,
`student_name` varchar(255) DEFAULT NOT NULL,
`class_id` int(11) DEFAULT NOT NULL,
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
alter table student add column gender char(1) not null;
-- ----------------------------
-- 题目5
-- 5.试修改学生姓名列数据类型为定长字符型10位。
-- ----------------------------
alter table student modify student_name char(10)
作业2
-- ----------------------------
-- 题目1
-- 1.简述五种约束的含义
-- ----------------------------
1、主键约束(Primay Key Coustraint) 唯一性,非空性
2、唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
3、检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)
4、默认约束 (Default Counstraint)该数据的默认值
5、外键约束 (Foreign Key Counstraint)需要建立两表间的关系并引用主表的列
-- ----------------------------
-- 题目2
-- 2.创建学生关系sc,包括属性名
-- ----------------------------
CREATE TABLE `sc` (
`no` int(11) NOT NULL,
`sno` int(11) DEFAULT NULL,
`cno` int(11) DEFAULT NULL,
`grade` int(11) DEFAULT NULL,
PRIMARY KEY (`no`),
KEY `Fsno` (`sno`),
KEY `Fcno` (`cno`),
CONSTRAINT `Fcno` FOREIGN KEY (`cno`) REFERENCES `course` (`cno`),
CONSTRAINT `Fsno` FOREIGN KEY (`sno`) REFERENCES `student` (`student_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- 题目3
-- 3.创建copy_emp,要求格式同emp表完全一样,不包含数据。
-- ----------------------------
CREATE table copy_emp like emp
-- ----------------------------
-- 题目4
-- 4.创建copy_dept,要求格式同dept表完全一样,不包含数据。
-- ----------------------------
CREATE table copy_dept like dept
-- ----------------------------
-- 题目5
-- 5.设置copy_emp 表中外键deptno,参照copy_dept中deptno,语句能否成功,为什么?
-- ----------------------------
-- 可以,新表不包含数据,不会受到约束
alter table copy_emp add foreign key (deptno) references copy_dept(deptno);
-- ----------------------------
-- 题目6
-- 6.追加copy_dept表中主键deptno
-- ----------------------------
alter table copy_dept add primary key(deptno);
作业3
CREATE TABLE `dept` (
`dept_no` INT PRIMARY KEY,
`dept_name` VARCHAR(64) UNIQUE KEY,
`dept_director` VARCHAR(64) NOT NULL,
`campus` enum('南湖校区','浑南校区')
);
CREATE TABLE `class` (
`cno` INT PRIMARY KEY,
`cname` VARCHAR(64) UNIQUE KEY,
`dept_no` INT,
FOREIGN KEY (`dept_no`) REFERENCES `dept`(`dept_no`)
);
CREATE TABLE `student` (
`sno` CHAR(10) PRIMARY KEY,
`sname` VARCHAR(20) NOT NULL,
`sex` CHAR(2),
`birthday` datetime,
`class` INT,
FOREIGN KEY (`class`) REFERENCES `class`(`cno`),
check (`sex` IN ('男','女'))
);