Mysql约束
MYSQL约束
主键
-- 主键的使用
CREATE TABLE t18 (
id INT PRIMARY KEY,-- 表示id列是主键
`name` VARCHAR (32),
email VARCHAR (32)
);
INSERT INTO t18 VALUES(1,'jack','www.com.cn')
-- id不能重复,将会报错
INSERT INTO t18 VALUES(1,'tom','wwww.ccdhdh')-- Duplicate entry '1' for key 't18.PRIMARY'
-- 主键使用细节讨论
-- 1.primary key 不能重复而且不能为Null
-- 2.一张表最多只能有一个主键,但可以是复合主键
-- 2.1 只能有一个主键
CREATE TABLE t19 (
id INT PRIMARY KEY,-- 表示id列是主键
`name` VARCHAR (32) PRIMARY KEY,
email VARCHAR (32)
);
-- 2.2 演示复合主键
-- 2个字段不能同时相同
CREATE TABLE t20 (
id INT ,-- 表示id列是主键
`name` VARCHAR (32),
email VARCHAR (32),
PRIMARY KEY (id,`name`)
);
INSERT INTO t20 VALUES(1,'tom','www.com');
INSERT INTO t20 VALUES(1,'jack','www.com');-- 此时也可以添加成功
INSERT INTO t20 VALUES(1,'jack','hhh.com');-- 此时和主键字段都相同,将不能添加成功
-- 3.主键的指定方式有2种
-- 3.1.直接在字段名后指定:字段名 primary key
-- 如: `name` varchar(32) primary key
-- 3.2在表的定义最后写primary key(列名)
CREATE TABLE t20 (
id INT ,-- 表示id列是主键
`name` VARCHAR (32),
email VARCHAR (32),
PRIMARY KEY (id,`name`)-- 单主键也一个即可
);
-- 4.使用desc 表名,可以看到primary key 情况
复合主键不是就是2个主键,而是2个列组合成一个主键
在实际开发中每个表往往都有一个主键
unique
-- unique的使用
CREATE TABLE t21 (
id INT UNIQUE,-- 表示id这一列不能重复
`name` VARCHAR (32),
email VARCHAR (32)
);
-- 演示功能
INSERT INTO t21 VALUES(1,'java','www.com.c');
INSERT INTO t21 VALUES(1,'python','www.edd');-- 此时将会提示错误
-- unique的使用细节
-- 1.如果没有指定 not null,则unique字段可以有 多个null
-- 因为它认为null是一个具体的值,可以放置多个null
INSERT INTO t21 VALUES(NULL,'tom','www.com.c');-- 成功
INSERT INTO t21 VALUES(NULL,'hheheh','www.com.c')-- 成功
-- 2.一张表可以有多个unique字段
外键
**
reference 参考
- 主表数据
-- 外键
-- 1.创建主表
CREATE TABLE my_class(
id INT PRIMARY KEY,-- 班级编号
`name` VARCHAR(32) NOT NULL DEFAULT'');
-- 2.创建从表
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)
-- 3.主表添加数据
INSERT INTO my_class
VALUES(100,'java'),(200,'web');
-- 4.从表添加数据
INSERT INTO my_stu
VALUES(1,'tom',100);-- 将会成功
INSERT INTO my_stu
VALUES(2,'jack',200);-- 将会成功
-- 下面的将会插入失败,因为主表中关联的没有300
INSERT INTO my_stu
VALUES(3,'hsp',300);-- 将会失败
innodb是指的是储存引擎
外键约束细节
-- 细节:一但建立了主外键关系,数据就不能随意删除了
-- 这个能不能删除,取决于所删除的记录是否已经进行了外键连接
-- 已经和从表中取得联系(所以该条记录不能删除)
DELETE FROM my_class
WHERE id=100;
-- 但是从表可以随意删除
DELETE FROM my_stu
WHERE class_id=100;
对外键约束的理解:外键约束是对从表中对应的字段的约束,从表中的添加的记录要求里面的外键字段的值必须在主表中出现,从表中的对应值也不能随意删除,需要主表中的对应值删除后才能删除
**
check约束
-- 演示check的使用
-- mysql 15.7目前还不支持check,只做语法校验,但不会生效
CREATE TABLE t23(
id INT PRIMARY KEY ,
`name` VARCHAR(32),
sex VARCHAR(6) CHECK(sex IN('man','woman')),
sal DOUBLE CHECK(sal>1000 AND sal<2000));
-- 添加数据
-- mid不在约束中,将会报错
INSERT INTO t23
VALUES(1,'jack','mid',1003)
-- 在约束中,将会添加成功
INSERT INTO t23
VALUES(2,'tom','man',1003)
SELECT * FROM t23
商店表设计
CREATE DATABASE shop_my
-- 1.商品表
CREATE TABLE goods(
goods_id INT PRIMARY KEY,-- 单号为主键
goods_name VARCHAR(32)NOT NULL DEFAULT '',
unitprice DOUBLE -- 商品单价
CHECK (unitprice >=1.0 AND unitprice<=9999.99)
NOT NULL DEFAULT 0 ,
category VARCHAR(32) NOT NULL DEFAULT '',-- 商品类别
provider VARCHAR(32) NOT NULL DEFAULT '',
)-- 供应商
-- 2.客户表
CREATE TABLE custmoer(
custmoer_id INT PRIMARY KEY,-- 主键
`name` VARCHAR(32) NOT NULL DEFAULT '',
address VARCHAR(32) NOT NULL DEFAULT '',
email VARCHAR(32)UNIQUE NOT NULL ,
sex ENUM('男','女')NOT NULL ,-- 使用枚举(里面只能放男或者女)也可以使用chack
card_Id CHAR(18)UNIQUE,
)
-- 3.创建(购买)purchase表
CREATE TABLE purchase(
order_id INT UNSIGNED PRIMARY KEY ,
customer_id INT UNIQUE,-- 定义成不重复
goods_id INT UNIQUE NOT NULL DEFAULT 0,
nums INT
FOREIGN KEY (goods_id)
REFERENCES goods(goods_id)
FOREIGN KEY (custmoer_id) REFERENCES
custmoer(customer_id)
)-- 购买数量
这里测试出来了,外键其实是对从表的约束,而不是对主键的约束,真理是站在多数人的一边
自增长
自增长只能放在主键或unique上面
添加自增长后表的结构如下:(将在表的结构中备注自增长)
-- 演示自增长的使用
CREATE TABLE t24(
id INT PRIMARY KEY AUTO_INCREMENT ,
email VARCHAR(32)NOT NULL DEFAULT '',
`name` VARCHAR(32)NOT NULL DEFAULT '')
-- 测试自增长的使用(此时id不赋值或者赋值为空将会按照1 2 3 4 5..自增)
-- 1.
INSERT INTO t24 VALUES(NULL ,'tom.qq.com','tom');
-- 2.
INSERT INTO t24(email,`name`) VALUES('hero.com','tom');
自增长细节
修改自增长开始值
当我们的表创建成功后可以使用一个语句:alter table 表名 auto_increament=自增长开始值来修改自增长的开始值
当在插入的时候,给自增长的列指定了规定的值,将以我们指定的值为准。下次没有指定数据,将找到我们表中自增长列最大数据+1
如:我们自增长从1开始,途中我们指定了一个值=100,下次自增长时将会自增长为101。不建议自增长时途中自己指定数据