MySQL白菜教程(Level 5)

2021-08-17  本文已影响0人  七喜丶

1、约束

在 SQL 中,约束是规定表中的数据规则。若存在违反约束的行为,行为就会阻止。它能帮助管理员更好地管理数据库,并且确保数据库中数据的正确性和有效性

实例如下:

创建表的非空约束

CREATE TABLE Users (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Age int
);

在一个已创建的表的 Age 字段中添加 NOT NULL 约束如下所示:

alter table User modify Age is not null;

在一个已创建的表的 Age 字段中删除 NOT NULL 约束如下所示:

alter table User modify Age is null;

注意
不要把 NULL 值与空串相混淆。NULL 值是没有值

它不是空串。如果指定' '(两个单引号,其间没有字符),这
在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无
值。NULL 值用关键字 NULL 而不是空串指定

实例如下:

create table 的唯一约束

// MYSQL
create table Users (
    id int not null,
    lastName varchar(255) ,
    firstName varchar(255) not null,
    age int,
    unique(lastName)
);

// SQL Server or Oracle
create table Users (
    id int not null,
    lastName varchar(255)  unique,
    firstName varchar(255) not null,
    age int,
);

// 命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
// MYSQL or SQL Server or Oracle
create table Users (
    id int not null,
    lastName varchar(255) ,
    firstName varchar(255) not null,
    age int,
    constraint uni_code(lastName, age)
);

alter table 的唯一约束

// Mysql or SQL Server or Oracle
alter table Users add unique(id);

// 当表已被创建时,需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
alter table Users add constraint uni_code(lastName, age);

撤销的唯一约束

// Mysql 
alter table Users drop index uni_code;

// SQL Server or Oracle
alter table Users drop constraint uni_code;
  1. NOT NULL UNIQUE 可以将表的一列或多列定义为唯一性属性,而 PRIMARY KEY 设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复
  2. PRIMARY KEY 可以与外键配合,从而形成主从表的关系,而 NOT NULL UNIQUE 则做不到这一点
  3. 更大的区别在逻辑设计上。 PRIMARY KEY 一般在逻辑设计中用作记录标识,这也是设置 PRIMARY KEY 的本来用意,而 UNIQUE 只是为了保证域/域组的唯一性

create table时添加 PRIMARY KEY 约束

// Mysql
create table Users (
    id int not null,
    lastName varchar(255) ,
    firstName varchar(255) not null,
    age int,
    primary key (lastName)
);

// SQL Server or Oracle
create table Users (
    id int not null primary key,
    lastName varchar(255) ,
    firstName varchar(255) not null,
    age int,
);

// 如需命名并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:
create table Users (
    id int not null,
    lastName varchar(255) ,
    firstName varchar(255) not null,
    age int,
    constraint pri_code primary key (id, age);
)

ALTER TABLE 时添加主键约束

alter table Users add primary key(id);

// 如需命名并定义多个列的 PRIMARY KEY 约束,可以使用下面的 SQL 语法:
// 如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)
alter table Users add constraint pri_code primary key(id, age);

撤销 PRIMARY KEY

// Mysql
alter table Users drop primary key;
//通过DESC table_name我们可以发现,Key 列上的约束已经为空了

// SQL Server or Oracle
alter table Users drop constraint pri_code;

CREATE TABLE 时的 SQL FOREIGN KEY 约束

// Mysql
CREATE TABLE `Orders`
(
`O_Id` int NOT NULL,
`OrderNo` int NOT NULL,
`P_Id` int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

// SQL Server or Oracle
CREATE TABLE `Orders`
(
`O_Id` int NOT NULL PRIMARY KEY,
`OrderNo` int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
// REFERENCES 表示 引用一个表

// 如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
CREATE TABLE `Orders`
(
`O_Id` int NOT NULL,
`OrderNo` int NOT NULL,
`P_Id` int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
// CONSTRAINT 表示约束,后面接约束名称,常用于创建约束和删除约束

ALTER TABLE 时的 SQL FOREIGN KEY 约束

// Mysql or SQL Server or Oracle
ALTER TABLE `Orders`
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

// 如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
ALTER TABLE `Orders`
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

撤销 FOREIGN KEY 约束

// Mysql
ALTER TABLE `Orders`
DROP FOREIGN KEY fk_PerOrders

// SQL Server or Oracle
 ALTER TABLE `Orders`
DROP CONSTRAINT fk_PerOrders

定义 CHECK 约束条件在某种程度上类似于编写查询的 WHERE 子句,使用不同的比较运算符(例如 AND、OR、BETWEEN、IN、LIKE 和 IS NULL)编写其布尔表达式,该布尔表达式将返回 TRUE、FALSE 或 UNKNOWN 。 当条件中存在 NULL 值时,CHECK约束将返回 UNKNOWN 值
CHECK 约束主要用于通过将插入的值限制为遵循定义的值、范围或格式规则的值来强制域完整性

创建表(CREATE TABLE)时添加 CHECK约束
在创建课程表 courses 时,给学生总数 student_count 字段加上一个大于 0 的约束

// Mysql
CREATE TABLE `courses`
(
`id` int,
`name` varchar(255),
`student_count` int,
`created_at` date,
`teacher_id` int,
CHECK (`student_count` > 0)
)

// SQL Server or Oracle
CREATE TABLE `courses`
(
`id` int
CHECK (`student_count` > 0),
`name` varchar(255),`student_count` int,
`created_at` date,
`teacher_id` int
)

为多个列添加 CHECK 约束

CREATE TABLE `courses`
(
`id` int,
`name` varchar(255),
`student_count` int,
`created_at` date,
`teacher_id` int,
CHECK (`student_count` > 0 AND `teacher_id` > 0)
)

为 CHECK 约束命名

CREATE TABLE `courses`
(
`id` int,
`name` varchar(255),
`student_count` int,
`created_at` date,
`teacher_id` int,
CONSTRAINT chk_courses CHECK (`student_count` > 0) ;

// 核心语法:
[CONSTRAINT <constraint name>] CHECK (<condition>)

表已存在时添加 CHECK 约束

ALTER TABLE `courses` 
ADD CHECK ( `student_count` > 0);

//or

ALTER TABLE `courses`  
ADD CONSTRAINT chk_courses CHECK ( `student_count` > 0 AND `teacher_id` > 0);

撤销 CHECK 约束

// Mysql
ALTER TABLE `courses` 
DROP CHECK chk_courses;

// SQL Server or Oracle
ALTER TABLE `courses` 
DROP CONSTRAINT chk_courses

CREATE TABLE 时的 DEFAULT 约束

CREATE TABLE `Persons`
(
    `P_Id` int NOT NULL,
    `LastName` varchar(255) NOT NULL,
    `FirstName` varchar(255),
    `Address` varchar(255),
    `City` varchar(255) DEFAULT 'Sandnes'
)

ALTER TABLE 时的 DEFAULT 约束

// Mysql
ALTER TABLE `Persons`
ALTER `City` SET DEFAULT 'SANDNES';

// SQL Server or Oracle
ALTER TABLE `Persons`
ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for `City`;

撤销 DEFAULT 约束

// Mysql
ALTER TABLE `Persons`
ALTER `City` DROP DEFAULT;

//SQL Server or Oracle
ALTER TABLE `Persons`
ALTER COLUMN `City` DROP DEFAULT;
上一篇 下一篇

猜你喜欢

热点阅读