MySQL 14 SQL 约束

1 介绍

约束是一种限制,通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

2 约束分类

  • 主键:PRIMARY KEY

主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键不能有重复且不能为空

  • 默认值: DEFAULT

默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
INSERT语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充

  • 唯一: UNIQUE

唯一约束 (UNIQUE) ,规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE约束,则 INSERT 失败

  • 外键: FOREIGN KEY

外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须参考另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在 INSERT 时,如果被外键约束的值没有在参考列中有对应,则INSERT 失败

  • 非空: NOT NULL

被非空约束的列,在插入值时必须非空

3 示例

1)创建数据库、表

CREATE DATABASE mysql_shiyan;

use mysql_shiyan;

CREATE TABLE department
(
  dpt_name   CHAR(20) NOT NULL,
  people_num INT(10) DEFAULT '10',
  CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
 );

CREATE TABLE employee
(
  id      INT(10) PRIMARY KEY,
  name    CHAR(20),
  age     INT(10),
  salary  INT(10) NOT NULL,
  phone   INT(12) NOT NULL,
  in_dpt  CHAR(20) NOT NULL,
  UNIQUE  (phone),
  CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
 );

CREATE TABLE project
(
  proj_num   INT(10) NOT NULL,
  proj_name  CHAR(20) NOT NULL,
  start_date DATE NOT NULL,
  end_date   DATE DEFAULT '2015-04-01',
  of_dpt     CHAR(20) REFERENCES department(dpt_name),
  CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
 );

2)示例

// 默认值示例
mysql> INSERT INTO department VALUES('dept1',20);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO department (dpt_name) VALUES('dept2');
Query OK, 1 row affected (0.00 sec)

mysql> select * from department;
+----------+------------+
| dpt_name | people_num |
+----------+------------+
| dept1    |         20 |
| dept2    |         10 |
+----------+------------+
2 rows in set (0.00 sec)

// 外键约束示例
// 参考列department(dpt_name)中没有dept3,所以出错
mysql> INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dept3');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mysql_shiyan`.`employee`, CONSTRAINT `emp_fk` FOREIGN KEY (`in_dpt`) REFERENCES `department` (`dpt_name`))

mysql> INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dept2');
Query OK, 1 row affected (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值