目录
一、约束定义
二、约束分类
三、定义约束
四、约束相关语法格式
4.1主键约束(Primary Key Constraint):
4.2外键约束(Foreign Key Constraint):
4.3唯一约束(Unique Constraint):
4.4检查约束(Check Constraint):
4.5默认约束(Default Constraint):
4.6非空约束(Not Null Constraint):
五、约束用法
5.1主键约束(Primary Key Constraint):
5.1.1验证主键约束:
5.1.2注意事项:
5.2外键约束(Foreign Key Constraint):
5.2.1验证外键约束:
5.2.2注意事项:
5.3唯一约束(Unique Constraint):
5.3.1验证唯一约束:
5.3.2注意事项:
5.4检查约束(Check Constraint):
5.4.1验证检查约束:
5.4.2注意事项:
5.5默认约束(Default Constraint):
5.5.1验证默认约束:
5.5.2注意事项:
5.6非空约束(Not Null Constraint):
5.6.1验证非空约束:
编辑5.6.2注意事项:
六、约束参考学习
约束是用于定义和实施表的规则和限制,以确保数据的完整性和一致性。
即对一张表中的属性操作进行限制。
通过定义约束,可以对数据库中的数据进行限制,以下是常见的约束:
- 用途:用于唯一标识表中的每一行数据,并且不允许为空。
- 语法:`PRIMARY KEY (column1, column2, ...)`。
- 用途:用于建立表与表之间的关系,确保引用其他表中存在的值。
- 语法:`FOREIGN KEY (column1, column2, ...) REFERENCES parent_table (parent_column1, parent_column2, ...)`。
- 用途:确保表中的某个列或一组列的值是唯一的。
- 语法:`UNIQUE (column1, column2, ...)`。
- 用途:定义一个布尔表达式来评估插入或更新的值是否满足特定条件。
- 语法:`CHECK (condition)`。
- 用途:为给定列提供默认值,如果插入或更新操作未指定该列的值,则将使用默认值。
- 语法:`DEFAULT value`。
- 用途:确保列不允许包含空值。
- 语法:`column_name datatype NOT NULL`。
约束可以在创建表时直接定义,也可以在后期通过修改表结构来添加或删除。使用约束可以提高数据库的完整性和一致性,防止无效或不符合规范的数据被插入到表中。
通过表的创建语句或者修改表结构的语句来定义约束。以下是两种常见的方法:
- 使用CREATE TABLE语句来创建表,并在列定义之后添加约束。
- 例如,创建一个包含主键和唯一约束的表:
CREATE TABLE TableName (
column1 datatype CONSTRAINT PK_ConstraintName PRIMARY KEY,
column2 datatype CONSTRAINT UK_ConstraintName UNIQUE,
...
);
- 使用ALTER TABLE语句来为已存在的表添加、修改或删除约束。
- 例如,为现有表添加外键约束:
ALTER TABLE TableName
ADD CONSTRAINT FK_ConstraintName FOREIGN KEY (column1) REFERENCES ParentTable (parent_column);
注意:
无论是在表创建过程中还是在后期修改表结构时定义约束,都需要指定约束的类型(如主键、外键等)以及相关的信息(如列名、引用表等)。此外,还可以为约束指定名称以便更好地标识和管理。约束的定义通常遵循特定的语法规则,但具体的语法格式可能会因数据库版本和具体需求而略有不同。
约束的定义可能受到其他因素的限制,如数据类型的兼容性、表的引擎类型等。在定义约束之前,建议对表结构和约束条件进行仔细设计和规划,确保其适用于数据模型和业务需求。
使用以下语法格式来创建、删除和修改六种常见的约束类型:主键约束、唯一约束、外键约束、检查约束、默认约束和非空约束。
--1.创建主键约束
-- 语法格式:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 PRIMARY KEY (列名);
-- 示例:
ALTER TABLE Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID);
--2.删除主键约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT PK_Employees;
--3.修改主键约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
ALTER TABLE 表名
ADD CONSTRAINT 新约束名 PRIMARY KEY (列名);
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT PK_Employees;
ALTER TABLE Employees
ADD CONSTRAINT PK_Employees_New PRIMARY KEY (EmployeeID);
--1.创建外键约束
-- 语法格式:
ALTER TABLE 子表名
ADD CONSTRAINT 约束名
FOREIGN KEY (子表关联列)
REFERENCES 主表名 (主表关联列);
-- 示例:
ALTER TABLE Employees
ADD CONSTRAINT FK_Employees_Departments
FOREIGN KEY (DepartmentID)
REFERENCES Departments(DepartmentID);
--2.删除外键约束
-- 语法格式:
ALTER TABLE 子表名
DROP CONSTRAINT 约束名;
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT FK_Employees_Departments;
--3.修改外键约束
-- 语法格式:
ALTER TABLE 子表名
DROP CONSTRAINT 约束名;
ALTER TABLE 子表名
ADD CONSTRAINT 新约束名 FOREIGN KEY (子表关联列)
REFERENCES 主表名 (主表关联列);
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT FK_Employees_Departments;
ALTER TABLE Employees
ADD CONSTRAINT FK_Employees_Departments_New
FOREIGN KEY (DepartmentID)
REFERENCES Departments(DepartmentID);
--1.创建唯一约束
-- 语法格式:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 UNIQUE (列名);
-- 示例:
ALTER TABLE Employees
ADD CONSTRAINT UQ_Employees_Email UNIQUE (Email);
--2.删除唯一约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT UQ_Employees_Email;
--3.修改唯一约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
ALTER TABLE 表名
ADD CONSTRAINT 新约束名 UNIQUE (列名);
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT UQ_Employees_Email;
ALTER TABLE Employees
ADD CONSTRAINT UQ_Employees_Email_New UNIQUE (Email);
--1.创建检查约束
-- 语法格式:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 CHECK (条件);
-- 示例:
ALTER TABLE Employees
ADD CONSTRAINT CK_Employees_Salary CHECK (Salary > 0);
--2.删除检查约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT CK_Employees_Salary;
--3.修改检查约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
ALTER TABLE 表名
ADD CONSTRAINT 新约束名 CHECK (条件);
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT CK_Employees_Salary;
ALTER TABLE Employees
ADD CONSTRAINT CK_Employees_Salary_New CHECK (Salary > 1000);
--1.创建默认约束
-- 语法格式:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 DEFAULT 默认值 FOR 列名;
-- 示例:
ALTER TABLE Employees
ADD CONSTRAINT DF_Employees_HireDate DEFAULT GETDATE() FOR HireDate;
--2.删除默认约束
-- 语法格式:
ALTER TABLE 表名
ALTER COLUMN 列名 DROP DEFAULT;
-- 示例:
ALTER TABLE Employees
ALTER COLUMN HireDate DROP DEFAULT;
--3.修改默认约束
-- 语法格式:
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
ALTER TABLE 表名
ADD CONSTRAINT 新约束名 DEFAULT 默认值 FOR 列名;
-- 示例:
ALTER TABLE Employees
DROP CONSTRAINT DF_Employees_HireDate;
ALTER TABLE Employees
ADD CONSTRAINT DF_Employees_HireDate_New DEFAULT GETDATE() FOR HireDate;
--1.创建非空约束
-- 语法格式:
ALTER TABLE 表名
ALTER COLUMN 列名 数据类型 NOT NULL;
-- 示例:
ALTER TABLE Employees
ALTER COLUMN Address VARCHAR(100) NOT NULL;
--2.删除非空约束
-- 语法格式:
ALTER TABLE 表名
ALTER COLUMN 列名 数据类型 NULL;
-- 示例:
ALTER TABLE Employees
ALTER COLUMN Address VARCHAR(100) NULL;
--3.修改非空约束
-- 语法格式:
ALTER TABLE 表名
ALTER COLUMN 列名 数据类型 NOT NULL;
-- 示例:
ALTER TABLE Employees
ALTER COLUMN Address VARCHAR(200) NOT NULL;
注意:
通过使用以上的语法格式,可以对指定表的约束进行创建、修改和删除。
- 在修改约束之前,要确保了解并满足新的约束要求,并确保没有数据违反约束。
- 在删除约束之前,要确保没有数据依赖于该约束,并且备份数据以防止意外的数据损失。
- 对于某些约束,需要先删除约束才能修改列的定义,然后再重新添加约束。在实际操作中,一定要谨慎处理对表结构的改变,并确保在进行任何更改之前备份数据。
创建表Employees1,来完成各种约束的创建,用法如下:
通过CONSTRAINT PK_Employees PRIMARY KEY
指定EmployeeID作为主键,保证每行数据的唯一性。
-- 创建表 并定义主键
CREATE TABLE Employees1 (
EmployeeID INT CONSTRAINT PK_Employees PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
DepartmentID INT,
Salary DECIMAL(10, 2) DEFAULT 0
);
向表中插入数据;
-- 插入数据
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES
(1, 'John', 'Doe', 1, 5000),
(2, 'Jane', 'Smith', 2, 6000),
(3, 'David', 'Johnson', 1, 4500);
查询如下:
向表中试图插入具有相同EmployeeID的记录,比如:
-- 插入数据(主键验证)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES
(1, 'tom', 'Min', 2, 5500)
执行结果如下:
在使用主键约束时,需要注意以下几点:
总结:
使用主键约束可以确保表中的每行都具有唯一标识并且非空。在使用主键约束时,要注意唯一性、非空性、不可修改性、命名规范以及与其他表的引用关系。这样可以确保数据的完整性和一致性,并提高数据库的性能和可维护性。
创建表Departments1,并向表内插入数据:
-- 创建Departments1表
CREATE TABLE Departments1 (
DepartmentID INT CONSTRAINT PK_Departments PRIMARY KEY,
DepartmentName VARCHAR(50) NOT NULL
);
-- 向Departments表插入数据
INSERT INTO Departments1 (DepartmentID, DepartmentName)
VALUES
(1, 'Sales'),
(2, 'Marketing');
查询如下:
然后使用ALTER TABLE
语句添加一个名为FK_Employees_Departments
的外键约束,将DepartmentID列与Departments1表的DepartmentID列关联起来,确保引用的值存在于父表中。
-- 添加外键约束
ALTER TABLE Employees1
ADD CONSTRAINT FK_Employees_Departments
FOREIGN KEY (DepartmentID)
REFERENCES Departments1(DepartmentID);
①向表中试图插入具有不存在的DepartmentID
的记录,比如:
-- 插入数据(外键验证)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES
(4, 'tom', 'Min', 3, 5500)
执行结果如下:
②更新Departments1表中被引用的部门记录 ,比如:
--更新Departments1表中被引用的部门记录 (外键验证)
update Departments1 set DepartmentID=3;
执行结果如下:
③删除Departments1表中被引用的部门记录,比如:
--删除Departments1表中被引用的部门记录 (外键验证)
delete from Departments1 where DepartmentID=1;
执行结果如下:
在使用外键约束时,需要注意以下几点:
总结:
在使用外键约束时,要确保引用关系的完整性,并注意数据的一致性、级联操作、删除和修改的限制。合理命名外键约束,考虑查询效率和索引的使用,以确保数据库的正常运行和性能优化。
向Employees1插入列Email,
ALTER TABLE Employees1
ADD Email VARCHAR(50);
查询如下:
通过ALTER TABLE
语句添加一个名为UQ_Employees_Email
的唯一约束,确保Email列的值在表中是唯一的。
-- 添加唯一约束
ALTER TABLE Employees1
ADD CONSTRAINT UQ_Employees_Email
UNIQUE (Email);
执行结果如下:
根据给出的错误消息,以下是该问题的概要:
- - 错误消息 1505 表示在创建唯一索引时发现重复的键值。
- - 错误消息指出重复的键值为 `
`,这意味着在 `dbo.Employees1` 表中有多个空值。 - - 错误消息 1750 指示由于先前的错误消息导致无法创建约束。
这些错误消息表明在尝试创建名为 `UQ_Employees_Email` 的唯一索引时遇到问题。索引名称和表对象名称之间存在冲突,而且在索引列中存在重复的空键值。
为了解决这个问题,可以采取以下步骤:
- 1. 首先,检查数据库中的 `dbo.Employees1` 表以确认是否存在重复的空键值。可以运行一个查询来找到重复的空值并处理它们。
SELECT * FROM dbo.Employees1 WHERE Email IS NULL
- 2. 处理重复的空值后,再次尝试创建唯一索引。确保将索引名称与表对象名称区分开,并确保索引列中不再包含重复的键值。
- 3. 如果问题仍然存在,检查其他约束或触发器是否可能导致冲突。可以检查表定义、其他索引定义、约束和触发器等来排除其他潜在的冲突源。
如果以上步骤都没有解决问题,可能需要进一步检查数据库架构和数据模型以确定导致此问题的根本原因。
对表中Email列数据更新:
--更新Employees1表数据
update Employees1 set Email='[email protected]' where EmployeeID=1;
update Employees1 set Email='[email protected]' where EmployeeID=2;
update Employees1 set Email='[email protected]' where EmployeeID=3;
查询结果如下:
此时再次执行添加唯一键约束,执行结果如下:
唯一约束用于确保表中的某一列或一组列的值是唯一的。要验证唯一约束是否按预期工作,可以尝试插入或更新数据,检查是否违反了唯一约束条件。有以下几种验证唯一约束的方法:
1. 尝试插入重复的值:
-- 插入数据
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID, Salary, Email)
VALUES
(4, 'tom', 'Min', 3, 5500,'[email protected]' )
执行结果如下:
2. 尝试更新为重复的值:
--更新数据
update Employees1 set Email='[email protected]' where EmployeeID=2;
执行结果如下:
3. 查询已存在的唯一值:
SELECT Email, COUNT(*) AS Count
FROM Employees1
GROUP BY Email
HAVING COUNT(*) > 1;
执行结果如下:
通过执行上述这些操作并观察结果,如果出现唯一约束错误或查询返回重复的唯一值,就表示唯一约束成功地阻止了重复数据的插入或更新。
注意:
当唯一约束被定义并且数据违反约束时,SQL Server会抛出唯一约束冲突的错误信息,提供相关的细节和错误代码,帮助识别和解决问题。
唯一约束(Unique Constraint)用于确保列或列组合的值是唯一的,需要注意以下几点:
总结:
在使用唯一约束时,要确保唯一性、索引的创建和命名、复合唯一约束的定义和数据完整性的保持。同时,需要注意与外键引用、修改约束和性能方面的考虑,以确保数据库的正常运行和性能优化。
使用ALTER TABLE
语句添加一个名为CHK_Employees_Salary
的检查约束,限制Salary列的值必须在0和100000之间。
-- 添加检查约束
ALTER TABLE Employees1
ADD CONSTRAINT CHK_Employees_Salary
CHECK (Salary >= 0 AND Salary <= 100000);
检查约束用于定义一个布尔表达式来评估插入或更新的值是否满足特定条件。要验证检查约束是否按预期工作,可以尝试执行插入或更新操作,并观察是否违反了定义的检查约束条件。有以下几种验证检查约束的方法:
1. 尝试插入或更新不满足条件的值:
--插入数据(验证检查约束)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary,Email)
VALUES
(4, 'tom', 'Min', 3, 100001,'[email protected]')
执行结果如下:
2. 查询违规的值:
SELECT *
FROM Employees1
WHERE Salary < 0 OR Salary > 100000;
执行结果如下:
通过执行上述这些操作并观察结果,如果出现检查约束错误或查询返回违反检查约束条件的行,就表示检查约束成功地阻止了不符合条件的数据的插入或更新。
请注意,当检查约束被定义并且数据违反约束时,SQL Server会抛出检查约束失败的错误信息,提供相关细节和错误代码,以帮助识别和解决问题。
需要注意以下几点:
总结:
在使用检查约束时,要确保检查条件的准确性和完整性,合理命名约束,注意修改约束的影响和检查条件与默认值的兼容性。同时,要注意性能方面的考虑,并在需要的情况下进行特殊字符转义和跨表检查约束的定义。这样可以确保数据库中的数据满足业务规则和完整性要求。
向Employees1表插入新列HireDate并更新数据:
--添加新列HireDate
ALTER TABLE Employees1
ADD HireDate date;
update Employees1 set HireDate='2021-1-1' where EmployeeID=1;
update Employees1 set HireDate='2021-2-1' where EmployeeID=2;
update Employees1 set HireDate='2021-3-1' where EmployeeID=3;
通过ALTER TABLE
语句修改HireDate列的定义,设置一个名为DF_Employees_HireDate
的默认约束,使得在插入新记录时,如果未提供HireDate的值,则默认为当前日期(GETDATE())。
-- 添加默认约束
-- 修改 HireDate 列的数据类型和允许 NULL 值
ALTER TABLE Employees1
ALTER COLUMN HireDate DATE NULL;
-- 添加 HireDate 列的默认约束
ALTER TABLE Employees1
ADD CONSTRAINT DF_Employees_HireDate DEFAULT GETDATE() FOR HireDate;
向Employees1表插入新数据:
--插入数据(验证默认约束)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary,Email)
VALUES
(4, 'tom', 'Min', 2, 8000,'[email protected]')
执行结果如下:
使用默认约束时,需要注意以下几点:
总结:
在使用默认约束时,要选择合适的默认值,注意NULL值的处理、命名约束、修改约束的影响和多列/跨表默认约束的定义。同时,要注意默认值的性能影响和约束的顺序,以确保数据库中的数据具有适当的默认值并满足业务规则。
向Employees1表插入新列Address并更新数据:
--添加新列Address
ALTER TABLE Employees1
ADD Address NVARCHAR(100);
update Employees1 set Address='M' where EmployeeID=1;
update Employees1 set Address='N' where EmployeeID=2;
update Employees1 set Address='W' where EmployeeID=3;
update Employees1 set Address='V' where EmployeeID=4;
使用ALTER TABLE
语句修改Address列的定义,确保该列不允许为空值。
-- 添加非空约束
ALTER TABLE Employees1
ALTER COLUMN Address NVARCHAR(100) NOT NULL;
--插入数据(验证非空约束)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary,Email)
VALUES
(5, 'key', 'Maxx', 2, 7000,'[email protected]')
执行结果如下:
--插入数据(验证非空约束)
INSERT INTO Employees1
(EmployeeID, FirstName, LastName, DepartmentID, Salary,Email,Address)
VALUES
(5, 'key', 'Maxx', 2, 7000,'[email protected]','m')
执行结果如下:
使用非空约束时,需要注意以下几点:
总结:
在使用非空约束时,要注意对列的定义、默认值的处理,修改限制和数据完整性的考虑。同时,需要注意与外键关系和默认约束的兼容性,以确保数据库中的数据满足非空约束并保持一致性。
在Oracle学习过程中,我也总结梳理了一篇关于约束的相关笔记,篇名是【Oracle中的约束】,笔记链接如下:http://t.csdn.cn/e1hx6
其实SQL sever、Oracle、MySQL等数据库他们的约束没有特别大的区别,有异曲同工之妙,我们均可以参考学习,然后自己做个梳理汇总,渐渐的就能理解并熟练运用。
最后感谢大家的支持,文章如有错误还请指正!