主键
# 主键
CREATE TABLE t17
(id INT PRIMARY KEY,
`name` VARCHAR(32),
email VARCHAR(32));
INSERT INTO t17
VALUES(1,'ybj','ybj@163.com');
-- 主键不能重复且不能为空null
INSERT INTO t17
VALUES(1,'cyt','cyt@163.com'); -- 主键重复无法添加
-- 一张表最多只有一个主键,但可以是复合主键(id+name)
-- 复合主键要满足都相同才无法添加,也就是同样的id和name
CREATE TABLE t18
(id INT,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY(id,`name`));
DESC t18
UNIQUE
# unique独特的
CREATE TABLE t17
(id INT UNIQUE, -- 表示id列不可以重复
`name` VARCHAR(32),
email VARCHAR(32));
-- unique如果没有指定not null,则可以为null
-- unique + not nall 类似 主键primary key
-- 一张表可以有多个unique
外键
# foreign key外键
-- 主表,外键所连的列必须primary key或者unique修饰
CREATE TABLE my_class
(id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '');
-- 从表
CREATE TABLE my_stu
(id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT,
FOREIGN KEY(class_id) REFERENCES my_class(id));
DESC my_class
DESC my_stu
INSERT INTO my_class
VALUES(100,'java'),(200,'web');
INSERT INTO my_stu
VALUES(1,'tom',100)
INSERT INTO my_stu
VALUES(2,'ybj',200)
INSERT INTO my_stu
VALUES(2,'cyt',300) -- 外键约束,添加失败,没有300班级
SELECT * FROM my_class
SELECT * FROM my_stu
check
# check mysql5.7还不支持check,只做语法校验
-- check就是限制你添加的数据范围
CREATE TABLE t23
(id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK (sal BETWEEN 1000 AND 2000));
INSERT INTO t23
VALUES(1,'tom','m',1500)
SELECT * FROM t23
自增长
# 自增长
-- 一般和主键配合使用,单独使用需要配合unique
-- 如果直接指定值,就按指定值,但后面的自增长就按指定值之后的值
CREATE TABLE t24
(id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32));
INSERT INTO t24
VALUES(NULL,'jack')
SELECT * FROM t24
INSERT INTO t24
VALUES(NULL,'tom')
INSERT INTO t24
(`name`) VALUES ('cyt')
ALTER TABLE t24 AUTO_INCREMENT = 10; -- 修改自增长从10开始,默认从1
INSERT INTO t24
(`name`) VALUES ('ybj')