马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
MySQL约束
约束用于确保数据库的数据满足特定的商业规则
在mysql中,约束包括:not null,unique,primary key,foreign key 和check 5种
1.primary key(主键)
用于唯一地标识表行的数据,当定义主键约束之后,该列不能重复
- primary key不能重复而且不能为null
- 一张表最多只能有一个主键,但是可以是复合主键
- 主键的指定方式有两种
- 直接在字段名后面指定:字段名 primary key
- 在表定义最后写 primary key(列名)
- 使用desc 表名,可以看到primary key的情况
- 在实际开发中,每一张表往往都会设计一个主键
例子
- -- 主键的使用
- -- id name email
- CREATE TABLE t17(
- id INT PRIMARY KEY, -- 表示id列是主键
- `name` VARCHAR(32),
- email VARCHAR(32)
- );
- INSERT INTO t17 VALUES(1,'jack','jack@sohu.com');
- INSERT INTO t17 VALUES(2,'tom','tom@sohu.com');
- -- 1. primary key不能重复而且不能为null
- INSERT INTO t17 VALUES(NULL,'jack','jack@sohu.com');-- 插入失败,Column 'id' cannot be null
- -- 2. 一张表最多只能有一个主键,但是可以是复合主键(比如id+name)
- -- 演示复合主键
- CREATE TABLE t18(
- id INT,
- `name` VARCHAR(32),
- email VARCHAR(32),
- PRIMARY KEY(id,`name`) -- 这里就是复合主键
- );
- INSERT INTO t18 VALUES(1,'tom','tom@sohu.com'); -- ok
- INSERT INTO t18 VALUES(1,'jack','jack@sohu.com');-- OK
- INSERT INTO t18 VALUES(1,'tom','12345@sohu.com'); -- false
- SELECT * FROM t18;
- -- 3. 主键的指定方式有两种
- -- 3.1直接在字段名后面指定:字段名 primary key
- CREATE TABLE t19(
- id INT PRIMARY KEY,
- `name` VARCHAR(32),
- email VARCHAR(32)
- );
- -- 3.2在表定义最后写 primary key(列名)
- CREATE TABLE t20(
- id INT,
- `name` VARCHAR(32),
- email VARCHAR(32),
- PRIMARY KEY(id)
- );
- -- 4. 使用desc 表名,可以看到primary key的情况
- DESC t20; -- 查看t20的情况,显示约束的情况
复制代码 2.not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据3.unique(唯一)
当定义了唯一约束后,该列值是不能重复的
- 如果没有指定not null,则unique字段可以有多个null
- 一张表可以有多个unique字段
- -- unique的使用
- CREATE TABLE t21(
- id INT UNIQUE, -- 表示id列不可重复
- `name` VARCHAR(32),
- email VARCHAR(32)
- )
- INSERT INTO t21 VALUES(1,'jack','jack@sohu.com'); -- ok
- INSERT INTO t21 VALUES(1,'tom','tom@sohu.com'); -- false,Duplicate entry '1' for key 'id'
- -- unique细节
- -- 1. 如果没有指定not null,则unique字段可以有多个null
- -- 如果一个列(字段),是 unique not null 则使用效果类似 primary key
- INSERT INTO t21 VALUES(NULL,'tom','tom@sohu.com');-- ok
- SELECT * FROM t21;
- -- 2. 一张表可以有多个unique字段
- CREATE TABLE t22(
- id INT UNIQUE, -- 表示id列不可重复
- `name` VARCHAR(32) UNIQUE, -- 表示name也不可以重复
- email VARCHAR(32)
- )
- DESC t22;
复制代码 4.foreign key(外键)
用于定义主表和从表之间的关系:
外键约束要定义在从表上,主表则必须具有主键约束或是unique约束。
当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null
- foreign key(本表字段名) references 主表名(主键名或unique字段名)
复制代码例子
- -- 外键演示
- -- 创建 主表 my_class
- CREATE TABLE my_class(
- id INT PRIMARY KEY, -- 班级编号
- `name` VARCHAR(32) NOT NULL DEFAULT ''
- );
- -- 创建从表 my_stu
- 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)
- );
- -- 测试数据
- INSERT INTO my_class VALUES(100,'java'),(200,'web');
- INSERT INTO my_class VALUES(300,'php');
- SELECT * FROM my_class;
- INSERT INTO my_stu VALUES(1,'tom',100);
- INSERT INTO my_stu VALUES(2,'jack',200);
- INSERT INTO my_stu VALUES(3,'hsp',300);
- INSERT INTO my_stu VALUES(4,'mary',400); -- 失败,因为400号班级不存在
- SELECT * FROM my_stu;
复制代码
- 外键指向的主表的字段,要求是primary key 或是unique
- 表的类型是innodb,这样的表才支持外键
- 外键字段的类型要和主键字段的类型一致(长度可以不同)
- 外键字段的值,必须在主键字段中出现过,或者为null [前提是外键字段允许为null]
- 一旦建立主外键的关系,数据就不能随意删除了
5.check
用于强制行数据必须满足的条件。假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在此范围,就会提示出错
提示:oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效
在mysql中实现check的功能,一般是在程序中控制或者通过触发器完成
例子
[code]-- 演示check的使用-- 目前mysql5.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 |