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。不建议自增长时途中自己指定数据

posted @ 2023-04-13 17:27  一往而深,  阅读(14)  评论(0编辑  收藏  举报