1. 主键约束

主键约束要求列的数据唯一,并且不能为空
主键能够唯一地标识表中的一条记录
主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。

1.1 单字段主键
直接在定义列的时候指定主键即可。

create table temp1(
num int PRIMARY KEY,
name varchar(11)
);

1.2 多字段主键

主键由多个字段联合组成,规则如下:
PRIMARY KEY(字段1,字段2...)


// 多个字段联合创建主键时, 不能按照以下方式创建, 否则报错
drop table If EXISTS temp1;
create table temp1(
num int PRIMARY KEY,
id int PRIMARY KEY,
name varchar(11)
);

mysql联合主键sql mysql联合主键约束_sql


// 正确方式, 创建成功
drop table If EXISTS temp1;
create table temp1(
num int,
id int,
name varchar(11),
PRIMARY KEY(num, id)
);



2. 外键约束

外键用来在两个表的数据之间建立链接,可以是一列或多列。
一个表可以有一个或多个外键。

2.0 数据源

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department`  (
  `id` int(11) PRIMARY KEY COMMENT '部门id',
  `departName` varchar(255) COMMENT '部门名字'
);
-- ---------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES (111, '研发部');
INSERT INTO `department` VALUES (222, '测试部');
INSERT INTO `department` VALUES (333, '行政部');
INSERT INTO `department` VALUES (444, '后勤部');
INSERT INTO `department` VALUES (555, '仓库');

-- ----------------------------
-- Table structure for nation
-- ----------------------------
DROP TABLE IF EXISTS `nation`;
CREATE TABLE `nation`  (
  `id` int(11) PRIMARY KEY COMMENT '民族id',
  `nation` varchar(255) COMMENT '民族'
);
-- ----------------------------
-- Records of nation
-- ----------------------------
INSERT INTO `nation` VALUES (103, '回族');
INSERT INTO `nation` VALUES (101, '汉族');
INSERT INTO `nation` VALUES (104, '蒙古族');
INSERT INTO `nation` VALUES (102, '高山族');

2.1 在创建表的时候指定创建外键
格式:CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段)

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) PRIMARY KEY COMMENT '学号',
  `name` varchar(10) COMMENT '姓名',
  `department` int(11),
  `nation` int(11),
  CONSTRAINT `f_department` FOREIGN KEY (`department`) REFERENCES `department` (`id`),
  CONSTRAINT `f_nation` FOREIGN KEY (`nation`) REFERENCES `nation` (`id`)
);

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, 'zhang', 111, 101);
INSERT INTO `student` VALUES (102, 'wang', 111, 102);
INSERT INTO `student` VALUES (103, 'li', 222, 103);
INSERT INTO `student` VALUES (104, 'zhao', 111, 103);
INSERT INTO `student` VALUES (105, 'han', 222, 102);
INSERT INTO `student` VALUES (106, 'cheng', 222, 104);
INSERT INTO `student` VALUES (107, 'long', 333, 104);

如上所示,我们在studnet表中已经创建了两个外键,其分别关联了department表和nation表中的主键字段。

mysql联合主键sql mysql联合主键约束_数据库_02


我们称student表为从表(子表),而department表和nation表为主表(父表)



mysql联合主键sql mysql联合主键约束_数据库_03


从上可以清晰的看出,此时student表中的department列和nation列中的数据只能是来自主表中关联字段的数据,不能是其他数据,否则无法插入成功。如下所示,企图修改为5555,但是5555不是主表department中主键的数据,直接报错。

mysql联合主键sql mysql联合主键约束_sql_04


2.2 单独为表添加外键
格式:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段)

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) PRIMARY KEY COMMENT '学号',
  `name` varchar(10) COMMENT '姓名',
  `department` int(11),
  `nation` int(11)
);

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, 'zhang', 111, 101);
INSERT INTO `student` VALUES (102, 'wang', 111, 102);
INSERT INTO `student` VALUES (103, 'li', 222, 103);
INSERT INTO `student` VALUES (104, 'zhao', 111, 103);
INSERT INTO `student` VALUES (105, 'han', 222, 102);
INSERT INTO `student` VALUES (106, 'cheng', 222, 104);
INSERT INTO `student` VALUES (107, 'long', 333, 104);

// 接下来, 为student创建外键, 将其与department表和nation表关联起来
ALTER TABLE student ADD CONSTRAINT `f_department` FOREIGN KEY (`department`) REFERENCES `department` (`id`);
ALTER TABLE student ADD CONSTRAINT `f_nation` FOREIGN KEY (`nation`) REFERENCES `nation` (`id`);

2.3 删除外键

对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系。
格式:ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

alter table student drop FOREIGN KEY f_department; 
alter table student drop FOREIGN KEY f_nation;

2.4 外键的删除/更新行为
NO ACTION:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL:在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null。(这就要求该外键值允许取null)
SET DEFAULT:父表有变更时,子表将外键列设置成一个默认的值。(InnoDB不支持)

格式:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段) ON UPDATE 行为 ON DELETE 行为

具体演示此处不再赘述,按照之前的数据自行更改测试即可。

3. 非空约束

格式:字段名 数据类型 not null
非空约束指代字段的值不能为空。对于使用了非空约束的字段,如果添加数据时没有指定值,那么直接报错。

4. 唯一性约束

格式:字段名 数据类型 UNIQUE
或者 CONSTRAINT 约束名 UNIQUE(字段)
唯一性约束要求该列唯一,允许为空,但只能出现一个空值。
唯一性约束可以保证一列或者几列的值不出现重复值。

DROP TABLE IF EXISTS `temp`;
CREATE TABLE `temp` (
  `num` int(11) UNIQUE,
  `name` varchar(255) 
) ;
DROP TABLE IF EXISTS `temp`;
CREATE TABLE `temp` (
  `num` int(11),
  `name` varchar(255),
	CONSTRAINT u_num UNIQUE(num)
) ;



5. 默认约束

格式:字段名 数据类型 DEFAULT 默认值
默认约束用来指定某列的默认值。如果插入记录时没有为该字段赋值,那么系统会自动为这个字段赋值为指定的默认值。


设置表的属性自动增加:字段 数据类型 auto_increment

mysql> create table student (
    -> num int  comment "学号" PRIMARY KEY auto_increment,
    -> name varchar(10)  default "zhang" comment "姓名" not null
    -> );
Query OK, 0 rows affected (0.27 sec)

mysql> desc student
    -> ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| num   | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | zhang   |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)