MySQL(6):约束

来源:互联网 发布:python spark 环境搭建 编辑:程序博客网 时间:2024/06/08 06:55
约束用于确保数据库数满足业务规则。(为了维护数据的完整性!...那正确性呢...?

约束包括:NOT NULL,UNIQUE,PRIMARY KEY,FOREIGN KEY以及CHECK等5种类型。

版本号为5.0.22的MySQL数据库,据说没有CHECK约束。


1. 主键约束

DROP DATABASE IF EXISTS mydb1;
CREATE DATABASE mydb1;
USE mydb1;

CREATE TABLE tb1 (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
uName VARCHAR(32)
);

INSERT INTO tb1 (uName) VALUES ('qcy1');
INSERT INTO tb1 (uName) VALUES ('qcy2');
INSERT INTO tb1 (uName) VALUES ('qcy3');
INSERT INTO tb1 (uName) VALUES ('qcy4');
INSERT INTO tb1 (uName) VALUES ('qcy5');

SELECT * FROM tb1;

数字转字符串

/* 比如将123转换为char类型 */
SELECT CAST(123 AS CHAR) FROM DUAL; 
/* 或者使用concat方法 */
SELECT CONCAT(123,'');


2. 唯一性约束


CREATE TABLE tb2 (
id INT UNIQUE,
uName VARCHAR(32)
);

INSERT INTO tb2 (id,uName) VALUES (1,'qcy1');
INSERT INTO tb2 (id,uName) VALUES (2,'qcy2');

INSERT INTO tb2 (id,uName) VALUES (2,'qcy3'); -- 报错

3. 非空约束
CREATE TABLE tb3 (
id INT PRIMARY KEY AUTO_INCREMENT,
uName VARCHAR(32) NOT NULL
);
INSERT INTO tb3 (uName) VALUES ('qcy');
INSERT INTO tb3 (uName) VALUES (''); -- 可以!
-- INSERT INTO tb3 (uName) VALUES (null); -- 不可以!
SELECT * FROM tb3;


4. 外键约束


-- 部门表
CREATE TABLE dept (
dId INT PRIMARY KEY AUTO_INCREMENT,
dName VARCHAR(64)
);
INSERT INTO dept (dName) VALUES ('财务部');
INSERT INTO dept (dName) VALUES ('科技部');

-- 雇员表
CREATE TABLE employee (
eId INT PRIMARY KEY AUTO_INCREMENT,
eName VARCHAR(64),
dId INT REFERENCES dept(dId) -- 只这样做,尽管这样不会报错!
-- 但是!外键没有搭起来!

);
INSERT INTO employee (eName, dId) VALUES ('qcy',3); -- 竟然可以添加一个3进去
DESC employee; -- 看不见外键
SELECT * FROM employee; -- 根本就没有把外键约束建立起来!

-- 要在表级建外键
-- constraint 外键名称_FK foreign key(从表的外键列) references 主表名称(外键指向从表的哪一列);

DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
eId INT PRIMARY KEY AUTO_INCREMENT,
eName VARCHAR(64),
-- dId INT REFERENCES dept(dId),
dId INT,
CONSTRAINT emp_FK FOREIGN KEY (dId) REFERENCES dept(dId)
);

SHOW CREATE TABLE employee;

DESC employee;

SELECT * FROM dept;
INSERT INTO employee (eName,dId) VALUES ('qcy',2);
INSERT INTO employee (eName,dId) VALUES ('qcy2',1);
INSERT INTO employee (eName,dId) VALUES ('qcy3',3);
SELECT * FROM employee;

SELECT eId, eName, dName FROM employee e, dept d 
WHERE e.dId = d.did ORDER BY eId ASC;

DESC employee;

-- “外键”约束也可以references to 本表中的某一列。
CREATE TABLE producttype(
id INT PRIMARY KEY,
catagory VARCHAR(32),
parentId INT,
CONSTRAINT type_fk FOREIGN KEY (parentid) REFERENCES producttype(id));


INSERT INTO producttype VALUES(1,'电器',NULL);
INSERT INTO producttype VALUES(2,'电冰箱',1);
INSERT INTO producttype VALUES(3,'电视机',1);

SELECT * FROM producttype WHERE parentId = 1;


advanced 分页

select * from table_name limit offset, N;

-- offset 偏移量

-- N 要取几条记录

通常应用软件开发的时候,会指定一页显示多少条记录pageSize,查询的时候,要查询一共多少条rowCount

获取某一页的信息,有一个页码参数pageNow

pageCount = (rowCount - 1) / pageSize + 1;

SELECT * FROM student LIMIT 偏移量为((pageNow-1) * pageSize), 要取出的记录数是 pageSize;

0 0