SQL约束

1. 约束的概念

  1. 约束是对表中的字段通过添加约束条件,来保证数据的正确和可靠性。

2. 常见的约束

• NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY
• CHECK
• DEFAULT

3.UNIQUE 唯一约束

1.特点

  • 不允许用重复数据出现
  • 允许为null ,但不允许有多个null,只能有一个,null也是不许重复的
  • 每个表可以有多个字段设置 UNIQUE约束。

2.添加 UNIQUE 约束

1.创建表时添加

下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:

MySQL:

CREATE TABLE Persons(
    Id_P int NOT NULL,
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50),
    UNIQUE (Id_P)  -- 采用的表级约束,对Id_P 字段添加的唯一约束, ()里面可以有多个字段,但每个字段长度不能超过767字节。
   )
CREATE TABLE Persons(
    Id_P int NOT NULL UNIQUE , -- 采用的列级约束,对Id_P 字段添加的唯一约束,长度不能超过767字节。
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50),
   )

SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
    Id_P int NOT NULL UNIQUE,  -- 采用的列级约束,对Id_P 字段添加的唯一约束,长度不能超过767字节。
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50)
)

2.表已存在时添加

当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (Id_P);    -- 通过修改表结构的方式,来添加表级字段约束
ALTER TABLE Persons
  MODIFY COLUMN Id_P INT  UNIQUE  ;   -- 通过修改表结构的方式,来添加列级字段约束

3. 重命名 UNIQUE约束

1.创建表时重命名

在创建表的时候默认的时候约束名字就叫UNIQUE,如果我们想更改约束名字请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)  --  UNIQUE 默认用()中第一个字段名命名。 uc_PersonID 是别名。
);

2.表已存在时重命名

当表已被创建时,如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP INDEX uc_PersonID,   --- 先删除 UNIQUE约束 的索引
ADD CONSTRAINT PersonID UNIQUE (Id_P,LastName);  --- 在重新创建 UNIQUE约束

4. 删除UNIQUE约束

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID   -- 这里只能通过DROP来删除约束,不能通过修改表的字段结构的方式去修改

SQL Server / Oracle / MS Access::

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 这里只能通过DROP来删除约束,不能通过修改表结构的方式去修改

4. NOT NULL 非空约束

1.特点

  • 强制字段不接受 NULL 值。
  • NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
  • 一个表中允许 多个字段设置 NOT NULL非空约束

2.添加 NOT NULL约束

1.创建表时添加

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,   -- 采用的列级约束,对字段添加 非空约束
     LastName varchar(50) NOT NULL, -- 采用的列级约束,对字段添加 非空约束
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50)
);

2.表已存在时添加

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
  MODIFY COLUMN LastName VARCHAR (20) NOT NULL ;   -- 通过修改字段的方式,来修改字段约束,添加上NOT NULL。

3.删除,修改 NOT NULL约束

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
  MODIFY COLUMN LastName VARCHAR (20) NULL ; --通过修改字段的方式,来修改字段约束,把NOT NULL修改成NULL,或直接删除不写约束来删除非空约束

5. PRIMARY KEY 主键约束

1.特点

  • PRIMARY KEY 约束唯一标识数据库表中的每条记录。
  • 主键必须包含唯一的值。
  • 主键列不能包含 NULL 值。
  • 每个表都应该有一个主键,并且每个表只能有一个主键。
  • 不能给多个字段设置多个主键, 一个主键可以保函多个字段。

2. 添加 PRIMARY KEY 主键约束

1.创建表时添加

下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:
MySQL /SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL PRIMARY KEY,   -- 采用的列级约束,对Id_P 字段添加的主键约束。 
     LastName varchar(50) NOT NULL,   --- 表只能有一个主键,但是可以保函多个字段,但不是每个字段都可以设置一个主键
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50)
);
CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     PRIMARY KEY (Id_P,LastName)  -- 采用的表级约束,对Id_P 字段添加的主键约束,() 里可以添加多个字段,以多个字段的值为标准作为主键约束条件
                                  --- 表只能有一个主键,但是可以保函多个字段,但不是每个字段都可以设置一个主键
);

2.表已存在时 添加 PRIMARY KEY

MySQL /SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)

3. 重命名 PRIMARY KEY约束名

1.创建表时重命名

在创建表的时候默认的时候约束名字就叫PRIMARY,如果我们想更改约束名字请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     CONSTRAINT uc_PersonID PRIMARY KEY(Id_P,LastName)  --  PRIMARY KEY默认用PRIMARY作为主键的约束名。 uc_PersonID 是别名。
);

2.表已存在时重命名

当表已被创建时,如需命名 PRIMARY KEY约束名,并定义多个列的 PRIMARY KEY约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP INDEX uc_PersonID,   --- 先删除 PRIMARY KEY约束名
ADD CONSTRAINT PersonID PRIMARY KEY(Id_P,LastName);  --- 在重新创建 PRIMARY KEY约束名

4. 删除PRIMARY KEY主键约束

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY   -- 这里只能通过DROP来删除约束,不能通过修改表的字段结构的方式去修改

SQL Server / Oracle / MS Access::

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 这里只能通过DROP来删除约束,不能通过修改表结构的方式去修改
                            -- 通过约束名字删除约束

6. FOREIGN KEY 外键约束

1.特点

  • 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY,保证两个字段的一致性。
  • FOREIGN KEY 约束用于预防破坏表之间连接的动作
  • FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

2.添加FOREIGN KEY 外键约束

1.创建表添加

我们知道FOREIGN KEY约束是需要关联另一张表的主键的,所以我们创建一个departments 部门表,然后用employees 员工表去管理部门表。SQL如下:
departments 表:

CREATE TABLE departments(
	department_id INT PRIMARY KEY, -- 这里设置为主键
	department_name VARCHAR(50) NOT NULL
)

employees 表:

CREATE TABLE employees(
	employee_id INT PRIMARY KEY,
	employee_name VARCHAR(50) NOT NULL,
	`email` VARCHAR(25),
	department_id INT(3) ZEROFILL NOT NULL, -- 这个字段的数据类型,必须与 departments表的department_id字段 的数据类型一致
	
	FOREIGN KEY (department_id) REFERENCES departments(department_id)  
                                            --  用employees表的department_id 去引用 departments表的department_id字段 做外键关联。
)

2.表已存在时添加

departments 表:

employee_id

employee_name

001

人事部

002

财务部

003

销售部

employees 表:

employee_id

employee_name

email

department_id

1

张飞

12222@163.com

001

2

关羽

12222@163.com

002

3

赵云

12222@163.com

003

ALTER TABLE employees
ADD FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 采用给表添加表记约束的方法,添加外键

3.重命名FOREIGN KEY外键约束名

1.创建表重命名

CREATE TABLE employees(
	employee_id INT PRIMARY KEY,
	employee_name VARCHAR(50) NOT NULL,
	`email` VARCHAR(25),
	department_id INT(3) ZEROFILL NOT NULL, -- 这个字段的数据类型,必须与 departments表的department_id字段 的数据类型一致
	
	CONSTRAINT  fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id)  
                                           --  用employees表的department_id 去引用 departments表的department_id字段 做外键关联。
)

2.表已存在时重命名

ALTER TABLE employees
DROP FOREIGN KEY fk_department_id, -- 先删除外键约束
ADD CONSTRAINT  fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id) 
                                     -- 在采用给表添加表记约束的方法,添加外键

4.删除FOREIGN KEY外键约束

mySql:

ALTER TABLE Orders
DROP FOREIGN KEY fk_department_id  -- fk_department_id外键是约束名字

SQL Server / Oracle / MS Access::

ALTER TABLE Orders
DROP CONSTRAINT fk_department_id  -- fk_department_id外键是约束名字

7. CHECK检查约束

1.特点

  • CHECK 约束用于限制列中的值的范围。

2.待完成

8.DEFAULT 默认约束

1.特点

  • DEFAULT 约束用于向列中插入默认值
  • 如果没有规定其他的值,那么会将默认值添加到所有的新记录。

2.添加 DEFAULT 约束

1.创建表时添加

下面的 SQL 在 "Persons" 表创建时在 "City" 列创建 DEFAULT 默认约束:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
    Id_P INT NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    FirstName VARCHAR(50),
    Address VARCHAR(50),
    City VARCHAR(50) DEFAULT '大连'  -- 在不指定字段的值的时候,默认值为大连
    
 )

通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:

待完成

2.表已存在时添加

当表已被创建时,如需在 "City" 列创建 DEFAULT 约束,请使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)  DEFAULT  '大连' ;   -- 通过修改表结构的方式,来对字段添加约束
ALTER TABLE Persons
ALTER City SET DEFAULT '大连';     -- 直接对字段添加DEFAULT

3. 修改DEFAULT约束的值

当表和字段的默认约束都存在时,可以添加约束的方法重新设置 默认约束的值,请使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)  DEFAULT  '大连' ;   -- 通过修改表结构的方式,约束的默认值
ALTER TABLE Persons
ALTER City SET DEFAULT '大连';     -- 通过添加约束的方法也可以修改 已有的约束值

4. 删除DEFAULT约束

MySQL / SQL Server / Oracle / MS Access::

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT   -- 通过DROP来删除指定字段的 DEFAULT约束
ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)    -- 通过修改字段,把字段的约束条件去掉