本博文源于mysql,对约束进行一系列实战练习,具体内容请点击,涉及:检查约束/主键/外键/默认值/非空/查看表中约束

约束的作用

解决数据冗余,一个信息存两遍。学术定义:解决数据的一致性与正确性

主键约束

设置主键格式

<字段名> <数据类型> PRIMARY KEY [默认值]

每个表只有一个主键,但可以有复合主键,所谓复合主键就是多列组合的主键

例子:在test_db数据库中创建tb_emp3数据表,其主键为id,格式如下表

字段名称

数据类型

备注

id

INT(11)

员工编号

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

如果大家没有这个数据库,直接用

CREATE DATABASE test_db;

创建,下面是对例题的解答

CREATE TABLE tb_emp3
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT
    -> );

mysql 非空字段 mysql非空主键怎么写_mysql

创建完列指定主键

格式

PRIMARY KEY [字段名]
例子:在test_db数据库中创建tb_emp4,使其主键为id

字段名称

数据类型

备注

id

INT(11)

员工编号

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

CREATE TABLE tb_emp4(id INT(11),
name VARCHAR(25),deptId INT(11),salary FLOAT,primary key(id));

mysql 非空字段 mysql非空主键怎么写_sql_02

设置复合主键

格式:

PRIMARY KEY [字段1、字段2、....、字段3]
例子:创建数据表tb_emp5,假设表中没有主键id,设置name与deptId为联合主键

字段名称

数据类型

备注

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

CREATE TABLE tb_emp5(name VARCHAR(25),
 deptId INT(11),salary FLOAT,primary key(name,deptId));

mysql 非空字段 mysql非空主键怎么写_主键_03

在修改表时添加主键约束

格式

ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);
例子:创建无主键tb_emp2,并用ALTER修改id为主键

字段名称

数据类型

备注

id

INT(11)

员工编号

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

mysql> use test_db;
Database changed
mysql> create table tb_emp1
    -> (
    -> id INT(11),
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT
    -> );

更换主键

ALTER TABLE tb_emp2 ADD primary key(id);

mysql 非空字段 mysql非空主键怎么写_mysql_04


大家在敲代码的时候忽略col3,这是我在这篇博文遗留下来的

mysql|表的(创建/修改/删除)[含实战练习] 这是博主上一篇写的博文。

外键约束

外键用来在两个表的数据之间建立连接的。

在创建表时设置外键约束

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,...]
REFERENCES <主表名> 主键列1 [,主键列2,...]
例子:外键约束关联到id

为做实验先创建这样一个表结构的一张表tb_dept1,在数据库test_db中哦!

字段名称

数据类型

备注

id

INT(11)

部门编号

name

VARCHAR(22)

部门名称

location

VARCHAR(22)

部门位置

CREATE TABLE tb_dept1(id INT(11) PRIMARY KEY,
 name VARCHAR(22) NOT NULL,location VARCHAR(50));

mysql 非空字段 mysql非空主键怎么写_数据库_05


创建数据表tb_emp6,并在表tb_emp6上创建外键约束,让它的键deptId作为外键关联到表tb_dept1的主键id,下表为表结构

字段名称

数据类型

备注

id

INT(11)

员工编号

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

了解表结构,添加了名称为fk_emp_dept1的外键约束,外键名称为deptId,其依赖于表tb_dept1的主键id

CREATE TABLE tb_emp6(id INT(11) PRIMARY KEY,name VARCHAR(25),
deptId INT(11),salary FLOAT,
CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id));

mysql 非空字段 mysql非空主键怎么写_主键_06

在修改表时添加外键约束

格式

ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
例子:修改数据表tb_emp2,将字段deptId设置为外键,与数据表tb_dept1的主键进行关联
mysql> ALTER TABLE tb_emp2
    -> ADD CONSTRAINT fk_tb_dept1
    -> FOREIGN KEY(deptId)
    -> REFERENCES tb_dept1(id);

mysql 非空字段 mysql非空主键怎么写_mysql 非空字段_07

删除外键约束

格式

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
例子:删除数据表tb_emp2中的外键约束fk_tb_dept1
ALTER TABLE tb_emp2
    -> DROP FOREIGN KEY fk_tb_dept1;

mysql 非空字段 mysql非空主键怎么写_主键_08

唯一约束

本身作用是可以确保一列或者几列不出现重复值。

在创建表时设置唯一约束

格式

<字段名> <数据类型> UNIQUE
例子:创建数据表tb_dept2格式如下,指定部门的名称唯一

字段名称

数据类型

备注

id

INT(11)

部门编号

name

VARCHAR(22)

部门名称

location

VARCHAR(50)

部门位置

CREATE TABLE tb_dept2(id INT(11) PRIMARY KEY,
 name VARCHAR(22) UNIQUE,location VARCHAR(50));

mysql 非空字段 mysql非空主键怎么写_主键_09

在修改表时添加唯一约束

ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE (<列名>);
例子:修改数据表tb_dept1,指定部门的名称唯一
ALTER TABLE tb_dept1 ADD CONSTRAINT unique_name UNIQUE(name);

mysql 非空字段 mysql非空主键怎么写_数据库_10

删除唯一约束

格式

ALTER TABLE <表名> DROP INDEX <唯一约束名>;
例子:删除数据表tb_dept1中的唯一约束unique_name
ALTER TABLE tb_dept1 DROP INDEX unique_name;

mysql 非空字段 mysql非空主键怎么写_主键_11

检查约束

这个用于指定需要检查的限定条件

在创建表时设置检查约束

格式

CHECK (<检查约束>)
例子:在test_db数据库中创建tb_emp7数据表格式如下,要求salary字段值大于0且小于10000

字段名称

数据类型

备注

id

INT(11)

员工编号

name

VARCHAR(25)

员工名称

deptId

INT(11)

所在部门编号

salary

FLOAT

工资

CREATE TABLE tb_emp7(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),
 salary FLOAT,CHECK(salary>0 and salary <100),
 FOREIGN KEY(deptId) REFERENCES tb_dept1(id));

mysql 非空字段 mysql非空主键怎么写_sql_12

在修改表时添加检查约束

格式

ALTER TABLE tb_emp6 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
例子:修改tb_emp7数据表,要求id字段值大于0
ALTER TABLE tb_emp7 ADD CONSTRAINT check_id CHECK(id>0);

mysql 非空字段 mysql非空主键怎么写_mysql_13

删除检查约束

格式

ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

默认值约束

换个名字叫叫,可以理解给字段设置默认值。

在创建表时设置默认值约束

格式

<字段名> <数据类型> DEFAULT <默认值>;
例子:创建数据表tb_dept3,指定部门位置默认为Beijing

字段名称

数据类型

备注

id

INT(11)

部门编号

name

VARCHAR(22)

部门名称

location

VARCHAR(50)

部门位置

CREATE TABLE tb_dept3(id INT(11) PRIMARY KEY,
 name VARCHAR(22),location VARCHAR(50) DEFAULT 'Beijing');

mysql 非空字段 mysql非空主键怎么写_mysql_14

在修改表时添加默认值约束

格式

ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <数据类型>  DEFAULT <默认值>;
例子:修改数据表tb_dept3,将部门默认值改为Shanghai
ALTER TABLE tb_dept3
    -> CHANGE COLUMN location
    -> location VARCHAR(50) DEFAULT 'Shanghai';

mysql 非空字段 mysql非空主键怎么写_sql_15

删除默认值约束

格式

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
例子:修改数据表tb_dept3,将部门位置的默认值约束删除
ALTER TABLE tb_dept3 CHANGE COLUMN location location VARCHAR(50) DEFAULT NULL;

mysql 非空字段 mysql非空主键怎么写_sql_16

非空约束

创建表时设置非空约束

格式

<字段名> 数据类型 NOT NULL;
例子:创建数据表tb_dept4,指定部门名称不能为空

表格式:

字段名称

数据类型

备注

id

INT(11)

部门编号

name

VARCHAR(22)

部门名称

location

VARCHAR(50)

部门位置

CREATE TABLE tb_dept4(id INT(11) PRIMARY KEY,
 name VARCHAR(22) NOT NULL,location VARCHAR(50));

mysql 非空字段 mysql非空主键怎么写_mysql_17

修改表时添加非空约束

格式

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名>
<字段名> <数据类型> NOT NULL;
例子:修改数据表tb_dept4,指定部门位置不能为空
ALTER TABLE tb_dept4 CHANGE COLUMN location location VARCHAR(50) NOT NULL;

mysql 非空字段 mysql非空主键怎么写_sql_18

删除非空约束

格式

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
例子:修改数据表tb_dept4,指定部门位置非空约束删除
ALTER TABLE tb_dept4 CHANGE COLUMN location location VARCHAR(50) NULL;

mysql 非空字段 mysql非空主键怎么写_sql_19

查看表中的约束

格式SHOW CREATE TABLE (数据表名)\G;

在“删除外键约束”标题里介绍过来了,可以往上查看相应的命令