MySQL之SQL——DDL(2)——常见约束、标识列

目录

1.常见约束

(1)创建表时添加约束

1)创建表时添加列级约束

2)创建表时添加表级约束

3)通用写法(什么时候用列级和表级约束)

(2)修改表时添加约束

(3)修改表时删除约束

补充:添加复合主键

2.标识列

(1)创建表时设置标识列

(2)系统中的步长和起始值

(3)修改表时设置标识列

(4)修改表时删除标识列


1.常见约束

CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型,
    表级约束
);

含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

分类:六大约束

  1. NOT NULL:非空,用于保证该字段的值不能为空        比如姓名、学号等
  2. DEFAULT:默认,用于保证该字段有默认值                 比如性别
  3. PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空           比如学号、员工编号等
  4. UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空                      比如座位号
  5. CHECK:检查约束【mysql中不支持】                         比如年龄、性别
  6. FOREIGN KEY外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值                比如学生表的专业编号,员工表的部门编号,员工表的工种编号

添加约束的时机:

  • 1.创建表时
  • 2.修改表时

约束的添加分类:

  • 列级约束:

        六大约束语法上都支持,但外键约束没有效果   

  • 表级约束:

        除了非空、默认,其他的都支持
        
        
主键和唯一的大对比:

             保证唯一性        是否允许为空    一个表中可以有多少个       是否允许组合(即多个字段组合成一个主键或唯一键)
    主键        √                          ×                            至多有1个                      √,但不推荐
    唯一        √                          √                            可以有多个                     √,但不推荐

唯一:

  • 设置为唯一约束的字段只能有一个值为null,null本身被当作一个值
  • 如下,插入null的字段为唯一键的话,这样插入两次null值就会报错

外键:

  1. 要求在从表设置外键关系
  2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容名称无要求
  3. 主表的关联列必须是一个key(一般是主键或唯一)
  4. 插入数据时,先插入主表,再插入从表
  5. 删除数据时,先删除从表,再删除主表

(1)创建表时添加约束

1)创建表时添加列级约束

语法:

直接在字段名和类型后面追加 约束类型即可。

可以添加多个约束,在后面用空格隔开追加即可

只支持:默认、非空、主键、唯一

示例:

CREATE DATABASE students;
USE students;

//创建major表
CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);

DROP TABLE stuinfo;

//创建stuinfo表
CREATE TABLE stuinfo(
	id INT PRIMARY KEY,                    #主键
	stuName VARCHAR(20) NOT NULL UNIQUE,   #非空
	gender CHAR(1) CHECK(gender='男' OR gender ='女'),         #检查
	seat INT UNIQUE,                       #唯一
	age INT DEFAULT  18,                   #默认约束
	major_id INT REFERENCES major(id)      #外键,可以写在这里,但是不生效
);

//查看表的结构
DESC stuinfo;          

MySQL之SQL——DDL(2)——常见约束、标识列_第1张图片

主键默认会被添加非空

//查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;

2)创建表时添加表级约束

语法:在各个字段的最下面
 【constraint 约束名】 约束类型(字段名) 

示例:

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);


DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	major_id INT,
	
	CONSTRAINT pk PRIMARY KEY(id),#主键
	CONSTRAINT uq UNIQUE(seat),#唯一键
	CONSTRAINT ck CHECK(gender ='男' OR gender  = '女'),#检查
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(major_id) REFERENCES major(id)#外键
);

//查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;

3)通用写法(什么时候用列级和表级约束)

CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuname VARCHAR(20),
	sex CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorid INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

(2)修改表时添加约束

语法:
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;

2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;

 示例:

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
    id INT,
    stuname VARCHAR(20),
    gender CHAR(1),
    seat INT,
    age INT,
    majorid INT
)

1)添加非空约束

ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20)  NOT NULL;

2)添加默认约束

ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

3)添加主键

  • a.列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
  • b.表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

4)添加唯一

  • a.列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
  • b.表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);

5)添加外键

ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); 

(3)修改表时删除约束

1)删除非空约束

ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

2)删除默认约束

ALTER TABLE stuinfo MODIFY COLUMN age INT ;

3)删除主键

ALTER TABLE stuinfo DROP PRIMARY KEY;

4)删除唯一

ALTER TABLE stuinfo DROP INDEX seat;

5)删除外键

ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

补充:添加复合主键

复合主键:即多个字段同时作为主键

CREATE TABLE sc(
	sid VARCHAR(20),
	cid VARCHAR(20),
	grade INT,
	
	PRIMARY KEY(sid,cid),  //在括号将多个字段使用逗号隔开就行
	
	FOREIGN KEY(sid) REFERENCES student(sid),
	FOREIGN KEY(cid) REFERENCES course(cid)
);

(4)mysql中两种模拟CHECK约束的方法

1)使用两个触发器:before insert和before update

待补充

2)使用可更新视图与check选项

待补充

2.标识列

又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值


特点:

  1. 标识列必须和主键搭配吗?不一定,但要求是一个key(主键,唯一键,外键)
  2. 一个表可以有几个标识列?至多一个!
  3. 标识列的类型只能是数值型
  4. 标识列可以通过 SET auto_increment_increment=3;设置步长
  5. 可以通过手动插入值,设置起始值

(1)创建表时设置标识列

CREATE TABLE tab_identity(
	id INT PRIMARY	KEY AUTO_INCREMENT,
	NAME  VARCHAR(20)
);

//创建表时不写标识列的值,或者插入null,标识列的值都会自增
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

MySQL之SQL——DDL(2)——常见约束、标识列_第2张图片

(2)系统中的步长和起始值

//查看系统中标识列的步长和起始值
SHOW VARIABLES LIKE '%auto_increment%';

//设置步长为3
SET auto_increment_increment=3;

但是可以通过取巧的方法插入一个起始的数据来间接更改起始值,比如:

DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
	id INT PRIMARY	KEY AUTO_INCREMENT,
	NAME  VARCHAR(20)
);


//开始的数据的id从10开始,后续插入数据就从10开始自增
INSERT INTO tab_identity(id,NAME) VALUES(10,'john');

INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

(3)修改表时设置标识列

ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

(4)修改表时删除标识列

ALTER TABLE tab_identity MODIFY COLUMN id INT;

 

你可能感兴趣的:(MySQL)