【MySQL】SQL菜鸟教程(三)

13. 约束(Constraints)

SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

语法:CREAT TABLE + CONSTRAINT

CREAT TABLE table_name
(
	column_name1 data_type(size) constraint_name,
	column_name2 data_type(size) constraint_name,
	column_name3 data_type(size) constraint_name,
	....
)

常见约束:

约束含义
NOT NULL指示某列不能存储NULL值
UNIQUE保证某列的每行必须有唯一的值
PRIMARY KEYNOT NULL和UNIQUE的结合。确保某列(或多列)有唯一标识,有助于更容易更快速地找到表中地一个特定的记录。
FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性
CHECK保证列中的值符合指定的条件
DEFAULT规定没有给列赋值时的默认值
INDEX用于快速访问数据库表中的数据

13.1 NOT NULL

NOT NULL 约束强制列不接受 NULL 值。NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

13.1.1 示例

1.强制 “ID” 列、 “LastName” 列以及 “FirstName” 列不接受 NULL 值:

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

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

ALTER TABLE Persons
MODIFY Age int NOT NULL

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

ALTER TABLE Persons
MODIFY Age int NULL

13.2 UNIQUE

UNIQUE 约束在 SQL 中用于确保一列或多列中的所有值都是唯一的,这意味着在约束应用的列中不能有重复的值。
UNIQUE 类似于主键 (PRIMARY KEY) 约束,但 UNIQUE 约束允许列中的值为 NULL,而主键不允许。
PRIMARY KEY 约束自带唯一性(UNIQUE)约束功能。
每个表可以有多个 UNIQUE 约束,但只能定义一个 PRIMARY KEY 约束。

13.2.1 示例

1.在创建表时,可以在特定列或多个列上定义 UNIQUE 约束,以确保这些列中的值在表内唯一。

在 “Persons” 表的 P_Id 列上添加 UNIQUE 约束:

CREATE TABLE Persons(
	P_Id int NOT NULL,
	LastName varchar(255) NOT NULL,
	FirstName varchar(255),
	Address varchar(255),
	City varchar(255),
	UNIQUE (P_Id)
	)

2.如果表已存在,可以使用 ALTER TABLE 语句在指定列上添加 UNIQUE 约束。

在 “P_Id” 列上添加 UNIQUE 约束:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

3.如果需要移除一个 UNIQUE 约束,可以使用以下 SQL 语句:

ALTER TABLE Persons
DROP INDEX uc_PersonID

13.3 PRIMARY KEY

PRIMARY KEY 约束唯一标识数据库表中的每条记录。
PRIMARY KEY 必须包含唯一的值,且不能包含 NULL 值。
每个表只能有一个 PRIMARY KEY,该主键可以由单个列或多个列组成。

13.3.1 示例

1.CREATE TABLE 时的 SQL PRIMARY KEY 约束。在 “Persons” 表创建时在 “P_Id” 列上创建 PRIMARY KEY 约束:

CREATE TABLE Persons(
	P_Id int NOT NULL,
	LastName varchar(255) NOT NULL,
	FirstName varchar(255),
	Address varchar(255),
	City varchar(255),
	PRIMARY KEY (P_Id)
	)

2.ALTER TABLE 时的 SQL PRIMARY KEY 约束
当表已被创建时,如需在 “P_Id” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

3.撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP PRIMARY KEY

13.4 FOREIGN KEY

一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

13.4.1 示例

1.CREATE TABLE 时的 SQL FOREIGN KEY 约束
下面的 SQL 在 “Orders” 表创建时在 “P_Id” 列上创建 FOREIGN KEY 约束:

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)
)

2.ALTER TABLE 时的 SQL FOREIGN KEY 约束
当 “Orders” 表已被创建时,如需在 “P_Id” 列创建 FOREIGN KEY 约束,请使用下面的 SQL:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

3.撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

13.5 CHECK

CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

13.5.1 示例

1.CREATE TABLE 时的 SQL CHECK 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 CHECK 约束。CHECK 约束规定 “P_Id” 列必须只包含大于 0 的整数。

CREATE TABLE Persons(
	P_Id int NOT NULL,
	LastName varchar(255) NOT NULL,
	FirstName varchar(255),
	Address varchar(255),
	City varchar(255),
	CHECK (P_Id>0)

2.如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:

CREATE TABLE Persons(
	P_Id int NOT NULL,
	LastName varchar(255) NOT NULL,
	FirstName varchar(255),
	Address varchar(255),
	City varchar(255),
	CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

3.ALTER TABLE 时的 SQL CHECK 约束
当表已被创建时,如需在 “P_Id” 列创建 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD CHECK (P_Id>0)

4.如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

5.撤销 CHECK 约束
如需撤销 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP CHECK chk_Person

13.6 DEFAULT

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

13.6.1 示例

1.CREATE TABLE 时的 SQL DEFAULT 约束
下面的 SQL 在 “Persons” 表创建时在 “City” 列上创建 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')

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

CREATE TABLE Orders
(
    O_Id int NOT NULL,
    OrderNo int NOT NULL,
    P_Id int,
    OrderDate date DEFAULT GETDATE()
)

3.ALTER TABLE 时的 SQL DEFAULT 约束
当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes'

4.撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

13.7 CREATE INDEX

CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。用户无法看到索引,它们只能被用来加速搜索/查询。更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引

13.7.1 语法

1.在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

2.在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值:

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

13.7.2 示例

1.在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:

CREATE INDEX PIndex
ON Persons (LastName)

2.如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

14.DROP

通过使用 DROP 语句,可以轻松地删除索引、表和数据库。

14.1 DROP INDEX

DROP INDEX 语句用于删除表中的索引。

14.1.1 语法

DROP INDEX [IF EXISTS] index_name
ON table_name

参数说明:

  • IF EXISTS:是一个可选的子句,用于检查索引是否存在。如果存在,就执行删除操作;如果不存在,不会报错。
  • index_name:要删除的索引的名称。
  • table_name:指定包含要删除索引的表的名称。

14.1.2 示例

1.假设有一个名为 idx_example 的索引要从名为 my_table 的表中删除:

DROP INDEX [IF EXISTS] idx_example
ON my_table

14.2 DROP TABLE

DROP TABLE 语句用于删除表。
删除表将同时删除表的结构以及存储在其中的所有数据。因此,在执行DROP TABLE语句之前,请确保您真的希望永久删除表及其所有数据,因为此操作是不可逆的

14.2.1 语法

DROP TABLE [IF EXISTS]  table_name

参数说明:

  • IF EXISTS:是一个可选的子句,用于检查表是否存在。如果存在,执行删除操作;如果不存在,不会报错
  • table_name:指定包含要删除的表的名称。

14.2.2 示例

1.假设要删除名为 my_table 的表:

DROP TABLE [IF EXISTS]  my_table

14.3 DROP DATABASE

DROP DATABASE 语句用于删除数据库,包括其中的所有表、视图、存储过程等数据库对象。是一个非常强大和危险的操作,因为它会永久删除整个数据库及其所有相关数据,因此在执行之前务必要慎重考虑并确保你真的希望执行此操作。

14.3.1 语法

DROP DATABASE [IF EXISTS]  database_name

参数说明:

  • IF EXISTS:是一个可选的子句,用于检查数据库是否存在。如果存在,执行删除操作;如果不存在,不会报错。
    +database_name:指定包含要删除的数据库的名称。

14.3.2 示例

1.假设要删除名为 my_database 的数据库:

DROP DATABASE [IF EXISTS]  my_database

15. ALTER TABLE

ALTER TABLE 语句用于在已有的表中添加、删除或修改列。

15.1 语法

1.如需在表中添加列,请使用下面的语法:

ALTER TABLE table_name
ADD column_name datatype

2.如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):

ALTER TABLE table_name
DROP COLUMN column_name

3.要改变表中列的数据类型,请使用下面的语法:

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

15.2 示例

“Persons” 表:

P_IdLastNameFirstNameAddressCity
1HansenOlaTimoteivn10
2SvendsonToveBorgvn23
3PettersenKariStorgt20

1.在 “Persons” 表中添加一个名为 “DateOfBirth” 的列:

ALTER TABLE Persons
ADD DateOfBirth date

这样的到新表:

P_IdLastNameFirstNameAddressCityDateOfBirth
1HansenOlaTimoteivn10Sandnes
2SvendsonToveBorgvn23Sandnes
3PettersenKariStorgt20Stavanger

2.改变 “Persons” 表中 “DateOfBirth” 列的数据类型:

ALTER TABLE Persons
ALTER COLUMN DateOfBirth year

这样将 “DateOfBirth” 列的类型改为 year,可以存放 2 位或 4 位格式的年份。

3.删除 “Person” 表中的 “DateOfBirth” 列:

ALTER TABLE Persons
DROP COLUMN DateOfBirth

16. DATE函数

当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要您的数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间部分,情况就有点复杂了。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。

函数含义
NOW()返回当前的日期和时间
CURDATE()返回当前的日期
CURTIME()返回当前的时间
DATE()提取日期或日期/时间表达式的日期部分
EXTRACT()返回日期/时间的单独部分
DATE_ADD()向日期添加指定的时间间隔
DATE_SUB()从日期减去指定的时间间隔
DATEDIFF()返回两个日期之间的天数
DATE_FORMAT()用不同的格式显示日期/时间

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式: YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
  • YEAR - 格式: YYYY或YY

16.1 示例

假设我们有如下的 “Orders” 表:

OrderIdProductNameOrderDate
1Geitost2008-11-11
2Camembert Pierrot2008-11-09
3Mozzarella di Giovanni2008-11-11
4Mascarpone Fabioli2008-10-29

1.从上表中选取 OrderDate 为 “2008-11-11” 的记录:

SELECT *
FROM Orders
WHERE OrderDate = '2008-11-11'

现在假设 “Orders” 表如下所示(请注意 “OrderDate” 列中的时间部分):

OrderIdProductNameOrderDate
1Geitost2008-11-11 13:23:44
2Camembert Pierrot2008-11-09 15:45:21
3Mozzarella di Giovanni2008-11-11 11:12:01
4Mascarpone Fabioli2008-10-29 14:56:59

如果我们使用和上面一样的 SELECT 语句:

SELECT *
FROM Orders
WHERE OrderDate = '2008-11-11'

那么我们将得不到结果!应该使用DATE()函数,它会忽略时间部分,只筛选日期部分匹配的记录:

SELECT *
FROM Orders
WHERE DATE(OrderDate) = '2008-11-11'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Faxxtty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值