MySQL数据库——常见约束和标识列
#常见约束 含义:一种限制,专门显示表中的数据,为了保证最终添加到表中的数据是准确可靠的 分类:六大约束 NOT NULL 非空约束,用于保障该字段值不能为空,比如姓名,学号等 DEFAULT 默认约束,用于保证该字段有默认值,比如性别 PRIMARY KEY 主键,保证该字段的值具有唯一性并且非空,比如学号等 UNIQUE 唯一,保证唯一性,但是可以为空,比如座位号 CHECK 检查,MySQL不支持!用于加条件,只有满足条件才可以添加 FOREIGN KEY 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值 在从表添加外键约束,用于引用主表中某列的值,比如专门编号,员工表部门编号等 添加约束的时机: 创建表时 修改表时 约束的添加分类: 列级约束 六个约束都可以写,语法上都支持,但外键约束没有效果! 表级约束 除了非空和默认,其他都支持 一、创建表时添加 1.添加列级约束 直接在字段名和类型后追加约束类型即可 只支持:默认、非空、主键、唯一 CREATE DATABASE students; USE students; CREATE TABLE stuinfo( id INT PRIMARY KEY, stuName VARCHAR(20) NOT NULL, gender CHAR(1) CHECK(gender='男' OR gender='女'), seat INT UNIQUE, age INT DEFAULT 18 ); 二、创建表级约束 在各个字段的最下面 【CONSTRAINT 约束名】 约束类型(字段名) 其中 名字可以不起 CREATE TABLE stuinfo( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, CONSTRAINT pk PRIMARY KEY(id), CONSTRAINT uq UNIQUE(seat), CONSTRAINT ck CHECK(gender IN('男','女') ); 通用的写法: 除了外键约束,其他的都写在字段后面, 外键写在所有字段后面,因为可能会有多个外键约束 主键和唯一的区别!【面试题】 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合(两个列组合成一个主键或者唯一键) 主键 √ × 至多有一个 允许,但不推荐 唯一 √ √ 可以有多个 允许,但不推荐 外键: 1.要求在从表上设置外键关系 2.从表的外键列的类型和主表的关联列的类型必须一致或兼容,名称无要求 3.要求主表中的关联列必须是一个KEY(主键或者唯一键) 4.插入数据时,先插入主表再插入从表 删除数据时,先删除从表,再删除主表 二、修改表时添加约束 1.添加非空约束 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL; 2.添加默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18; 3.添加主键约束 ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;#列级写法 ALTER TABLE stuinfo ADD PRIMARY KEY(id);#表级约束写法 4.添加唯一约束 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; ALTER TABLE stuinfo ADD UNIQUE(seat); 5.添加外键 #列级的写法没意义所以只有表级 ALTER TABLE stuinfo ADD FOREIGN KEY(maiorid) REFERENCES major(id); 三、修改表时删除约束 不写就行了呗 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 UNION seat; 5.删除外键 ALTER TABLE stuinfo DROP FOREIGN KEY majorid; #标识列: 又称为自增长列,可以不用我们手动插入值,系统提供默认序列值,默认从1开始 特点: 1.标识列必须和主键搭配吗 不一定。但要求是一个KEY 2.一个表中可以有多少个标识列 仅仅只能有一个。至多一个。 3.标识列的类型有没有限制 只能是数值型 INT FLOAT DOUBLE 4.标识列可以通过SET auto_increment_increment = 3设置步长 也可以通过手动插入值设置起始值 一、创建表时设置标识列 CREATE TABLE tab_identity( id INT PRIMARY KEY AUTO_INCREMENT,#加一个关键字即可 NAME VARCHAR(20) ); INSERT INTO tab_identity VALUES(NULL,'张三');#不用关心id,会自己增长 可以设置步长和起始值!但是MySQL中不支持设置起始值,可以设置步长 SET auto_increment_increment = 3; 一般不改! 二、修改表时设置标识列 ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT; 三、修改表时删除标识列 去掉关键字就行 ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;