SQL sever中的约束

目录

一、约束定义

二、约束分类

三、定义约束

四、约束相关语法格式

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注意事项:

 六、约束参考学习


一、约束定义

约束是用于定义和实施表的规则和限制,以确保数据的完整性和一致性。

即对一张表中的属性操作进行限制。

二、约束分类

通过定义约束,可以对数据库中的数据进行限制,以下是常见的约束:

  • 1. 主键约束(Primary Key Constraint):

   - 用途:用于唯一标识表中的每一行数据,并且不允许为空。
   - 语法:`PRIMARY KEY (column1, column2, ...)`。

  • 2. 外键约束(Foreign Key Constraint):

   - 用途:用于建立表与表之间的关系,确保引用其他表中存在的值。
   - 语法:`FOREIGN KEY (column1, column2, ...) REFERENCES parent_table (parent_column1, parent_column2, ...)`。

  • 3. 唯一约束(Unique Constraint):

   - 用途:确保表中的某个列或一组列的值是唯一的。
   - 语法:`UNIQUE (column1, column2, ...)`。

  • 4. 检查约束(Check Constraint):

   - 用途:定义一个布尔表达式来评估插入或更新的值是否满足特定条件。
   - 语法:`CHECK (condition)`。

  • 5. 默认约束(Default Constraint):

   - 用途:为给定列提供默认值,如果插入或更新操作未指定该列的值,则将使用默认值。
   - 语法:`DEFAULT value`。

  • 6. 非空约束(Not Null Constraint):

   - 用途:确保列不允许包含空值。
   - 语法:`column_name datatype NOT NULL`。

约束可以在创建表时直接定义,也可以在后期通过修改表结构来添加或删除。使用约束可以提高数据库的完整性和一致性,防止无效或不符合规范的数据被插入到表中。

三、定义约束

通过表的创建语句或者修改表结构的语句来定义约束。以下是两种常见的方法:

  • 3.1. 在创建表时定义约束:

   - 使用CREATE TABLE语句来创建表,并在列定义之后添加约束。
   - 例如,创建一个包含主键和唯一约束的表:

CREATE TABLE TableName (column1 datatype CONSTRAINT PK_ConstraintName PRIMARY KEY,column2 datatype CONSTRAINT UK_ConstraintName UNIQUE,...);
  • 3.2. 使用ALTER TABLE语句修改表结构来添加约束:

   - 使用ALTER TABLE语句来为已存在的表添加、修改或删除约束。
   - 例如,为现有表添加外键约束:

 ALTER TABLE TableNameADD CONSTRAINT FK_ConstraintName FOREIGN KEY (column1) REFERENCES ParentTable (parent_column);

注意:

      无论是在表创建过程中还是在后期修改表结构时定义约束,都需要指定约束的类型(如主键、外键等)以及相关的信息(如列名、引用表等)。此外,还可以为约束指定名称以便更好地标识和管理。约束的定义通常遵循特定的语法规则,但具体的语法格式可能会因数据库版本和具体需求而略有不同。

       约束的定义可能受到其他因素的限制,如数据类型的兼容性、表的引擎类型等。在定义约束之前,建议对表结构和约束条件进行仔细设计和规划,确保其适用于数据模型和业务需求。

四、约束相关语法格式

使用以下语法格式来创建、删除和修改六种常见的约束类型:主键约束、唯一约束、外键约束、检查约束、默认约束和非空约束。

4.1主键约束(Primary Key Constraint):

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

4.2外键约束(Foreign Key Constraint):

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

4.3唯一约束(Unique Constraint):

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

4.4检查约束(Check Constraint):

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

4.5默认约束(Default Constraint):

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

4.6非空约束(Not Null Constraint):

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

注意:

通过使用以上的语法格式,可以对指定表的约束进行创建、修改和删除。

  1. 在修改约束之前,要确保了解并满足新的约束要求,并确保没有数据违反约束。
  2. 在删除约束之前,要确保没有数据依赖于该约束,并且备份数据以防止意外的数据损失。 
  3. 对于某些约束,需要先删除约束才能修改列的定义,然后再重新添加约束。在实际操作中,一定要谨慎处理对表结构的改变,并确保在进行任何更改之前备份数据。

五、约束用法

创建表Employees1,来完成各种约束的创建,用法如下:

5.1主键约束(Primary Key Constraint):

通过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);

 查询如下:

5.1.1验证主键约束:

向表中试图插入具有相同EmployeeID的记录,比如:

-- 插入数据(主键验证)
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID,  Salary)
VALUES(1, 'tom', 'Min', 2,  5500)

执行结果如下:

5.1.2注意事项:

在使用主键约束时,需要注意以下几点:

  • 1. 唯一性:主键值必须在表中是唯一的。确保每行的主键值都不相同,以避免违反主键约束。如果插入或更新操作导致重复的主键值,将会触发主键冲突错误。
  • 2. 非空性:主键列不能为空(即不允许NULL值)。因此,在定义主键约束之前,应该确保列上没有NULL值。如果尝试将NULL值插入主键列,将会触发非空约束错误。
  • 3. 不可修改性:主键值一旦设置,通常是不允许更改的。这是为了确保主键的稳定性和数据完整性。如果确实需要更改主键值,那么首先需要删除原有的行,然后插入新的行。
  • 4. 主键命名:给主键约束命名时,应该选择有意义和描述性的名称,以提高代码的可读性和可维护性。通常使用"PK_"作为主键约束名称的前缀,以便于识别。
  • 5. 引用关系:主键通常被用来建立表与其他表的关联(外键引用)。当表存在外键引用时,删除或修改主键值可能会影响到其他表的数据完整性。在进行任何更改之前,请谨慎评估和处理相关的外键关系。
  • 6. 聚集索引:主键约束默认会创建一个聚集索引。聚集索引决定了表中数据的物理存储顺序。要根据查询需求和性能优化考虑是否使用聚集索引,并选择合适的列作为聚集索引的键。
  • 7. 复合主键:可以通过使用多个列来定义复合主键。在使用复合主键时,确保每个组合值都是唯一的,并且所有组合值都不为空。
  • 8. 自增长主键:可以使用IDENTITY属性或SEQUENCE对象来生成自增长的主键值。自增长主键为每个新行分配一个唯一的、递增的值。要正确使用自增长主键,请确保未手动插入主键值。

总结:

使用主键约束可以确保表中的每行都具有唯一标识并且非空。在使用主键约束时,要注意唯一性、非空性、不可修改性、命名规范以及与其他表的引用关系。这样可以确保数据的完整性和一致性,并提高数据库的性能和可维护性。 

5.2外键约束(Foreign Key Constraint):

创建表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);

5.2.1验证外键约束:

①向表中试图插入具有不存在的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;

 执行结果如下:

5.2.2注意事项:

在使用外键约束时,需要注意以下几点:

  • 1. 引用完整性:外键约束用于维护表之间的引用完整性。在定义外键约束之前,应确保所引用的主键或唯一键列存在,并且已经创建了相应的主键或唯一约束。
  • 2. 数据一致性:外键约束确保关联表中的数据保持一致。插入或更新包含外键的行时,确保引用值存在于关联表中,以避免违反外键约束。
  • 3. 级联操作:可以定义级联操作来处理与外键关联的操作。级联操作指定了当引用表中的数据发生改变时,对关联表中的数据的处理方式。常见的级联操作包括级联删除和级联更新。
  • 4. 删除限制:默认情况下,外键约束会阻止删除关联表中被引用的行。如果要删除关联表中的数据,必须首先删除引用它的所有行,或者定义级联删除操作来自动删除相关行。
  • 5. 修改限制:默认情况下,外键约束会阻止修改关联表中被引用的主键或唯一键列。如果需要修改关联列的值,必须先删除外键约束,然后进行修改。修改完成后,可以重新创建外键约束。
  • 6. 外键命名:给外键约束命名时,应选择有意义和描述性的名称,以提高代码的可读性和可维护性。通常使用"FK_"作为外键约束名称的前缀,以便于识别。
  • 7. 联接效率:外键约束可能会影响查询的性能。因此,在设计和使用外键时,要注意查询的联接操作,并根据具体需求考虑是否需要创建索引来优化查询性能。
  • 8. 外键顺序:在创建多个外键约束时,外键约束的顺序可能会对操作产生影响。如果存在循环引用,即多个表相互引用,必须谨慎处理外键的顺序和依赖关系。

总结:

在使用外键约束时,要确保引用关系的完整性,并注意数据的一致性、级联操作、删除和修改的限制。合理命名外键约束,考虑查询效率和索引的使用,以确保数据库的正常运行和性能优化。 

5.3唯一约束(Unique Constraint):

向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 表示在创建唯一索引时发现重复的键值。
  • - 错误消息指出重复的键值为 `<NULL>`,这意味着在 `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='john.doe@example.com' where EmployeeID=1;
update Employees1 set  Email='jane.smith@example.com' where EmployeeID=2;
update Employees1 set  Email='david.johnson@example.com' where EmployeeID=3;

 查询结果如下:

此时再次执行添加唯一键约束,执行结果如下:

 

5.3.1验证唯一约束:

唯一约束用于确保表中的某一列或一组列的值是唯一的。要验证唯一约束是否按预期工作,可以尝试插入或更新数据,检查是否违反了唯一约束条件。有以下几种验证唯一约束的方法:

1. 尝试插入重复的值:

  •    - 在执行INSERT语句时,如果尝试插入具有与已存在记录相同的唯一值的数据,将触发唯一约束错误。
  •    - 例如,在`Employees1`表中,如果尝试插入具有相同Email的记录,将违反唯一约束。
-- 插入数据
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID, Salary, Email)
VALUES(4, 'tom', 'Min', 3,  5500,'john.doe@example.com' )

执行结果如下: 

2. 尝试更新为重复的值:

  •    - 使用UPDATE语句时,如果将某一列更新为已存在于表中其他记录中的唯一值,将触发唯一约束错误。
  •    - 例如,在`Employees1`表中,如果将一个员工的Email更新为已经存在的Email,将违反唯一约束。
--更新数据
update Employees1 set  Email='john.doe@example.com' where EmployeeID=2;

执行结果如下: 

3. 查询已存在的唯一值:

  •    - 使用SELECT语句查询某一列的值,然后检查是否存在重复的唯一值。
  •    - 例如,在`Employees1`表中,可以使用以下查询来查找是否有重复的Email:
    SELECT Email, COUNT(*) AS CountFROM Employees1GROUP BY EmailHAVING COUNT(*) > 1;

执行结果如下: 

 

通过执行上述这些操作并观察结果,如果出现唯一约束错误或查询返回重复的唯一值,就表示唯一约束成功地阻止了重复数据的插入或更新。

注意:

当唯一约束被定义并且数据违反约束时,SQL Server会抛出唯一约束冲突的错误信息,提供相关的细节和错误代码,帮助识别和解决问题。

5.3.2注意事项:

唯一约束(Unique Constraint)用于确保列或列组合的值是唯一的,需要注意以下几点:

  • 1. 唯一性:唯一约束要求列或列组合中的值在表中是唯一的,不允许重复。确保每行的唯一约束值都不相同,以避免违反唯一性约束。
  • 2. NULL值:唯一约束默认可以包含一个NULL值。这意味着多个NULL值可以存在于列或列组合中而不违反唯一性约束。如果想要禁止NULL值重复,可以创建一个索引来实现。
  • 3. 索引创建:唯一约束会自动创建一个唯一索引来支持唯一性验证。确保在设计和使用唯一约束时,对相关列或列组合创建适当的索引,以提高查询效率。
  • 4. 复合唯一约束:可以使用多个列来定义复合唯一约束。复合唯一约束意味着多个列的组合必须是唯一的。在创建复合唯一约束时,确保每个组合值都是唯一的,且所有组合值都不为空。
  • 5. 唯一约束命名:给唯一约束命名时,应选择有意义和描述性的名称,以提高代码的可读性和可维护性。通常使用"UQ_"作为唯一约束名称的前缀,以便于识别。
  • 6. 修改限制:修改唯一约束会影响现有数据的一致性。如果要更改唯一约束的列或列组合,必须先删除原有的唯一约束,然后重新创建新的唯一约束。
  • 7. 外键引用:唯一约束常用于引用表之间的关系。如果将唯一约束用作外键的引用,需要确保被引用的唯一值与外键列或列组合相匹配,并且满足引用完整性的要求。
  • 8. 性能影响:唯一约束的索引可能会对插入、更新和删除操作的性能产生影响。在设计和使用唯一约束时,要平衡数据完整性和性能需求,根据具体情况选择是否使用唯一约束。

总结:

在使用唯一约束时,要确保唯一性、索引的创建和命名、复合唯一约束的定义和数据完整性的保持。同时,需要注意与外键引用、修改约束和性能方面的考虑,以确保数据库的正常运行和性能优化。 

5.4检查约束(Check Constraint):

使用ALTER TABLE语句添加一个名为CHK_Employees_Salary的检查约束,限制Salary列的值必须在0和100000之间。

-- 添加检查约束
ALTER TABLE Employees1
ADD CONSTRAINT CHK_Employees_Salary
CHECK (Salary >= 0 AND Salary <= 100000);

5.4.1验证检查约束:

检查约束用于定义一个布尔表达式来评估插入或更新的值是否满足特定条件。要验证检查约束是否按预期工作,可以尝试执行插入或更新操作,并观察是否违反了定义的检查约束条件。有以下几种验证检查约束的方法:

1. 尝试插入或更新不满足条件的值:

  •    - 在执行INSERT或UPDATE语句时,如果插入或更新的值不符合检查约束的条件,将触发检查约束错误。
  •    - 例如,在`Employees1`表中,假设我们有一个检查约束限制Salary列的取值范围必须在0到100000之间,如果尝试插入或更新一个超出此范围的Salary值,将违反检查约束。
--插入数据(验证检查约束)
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID,  Salary,Email)
VALUES(4, 'tom', 'Min', 3, 100001,'Tom.doe@example.com')

执行结果如下: 

2. 查询违规的值:

  •    - 使用SELECT语句查询相关列的数据,然后评估是否存在违反检查约束条件的值。
  •    - 例如,在`Employees1`表中,可以使用以下查询来查找Salary不在指定范围内的记录:
SELECT *
FROM Employees1
WHERE Salary < 0 OR Salary > 100000;

 执行结果如下:

通过执行上述这些操作并观察结果,如果出现检查约束错误或查询返回违反检查约束条件的行,就表示检查约束成功地阻止了不符合条件的数据的插入或更新。

请注意,当检查约束被定义并且数据违反约束时,SQL Server会抛出检查约束失败的错误信息,提供相关细节和错误代码,以帮助识别和解决问题。

5.4.2注意事项:

需要注意以下几点:

  • 1. 检查条件:检查约束用于限制列的取值范围。在定义检查约束时,要确保检查条件是准确的、完整的,并且符合业务规则和需求。
  • 2. 约束命名:给检查约束命名时,应选择有意义和描述性的名称,以提高代码的可读性和可维护性。通常使用"CK_"作为检查约束名称的前缀,以便于识别。
  • 3. 多列检查约束:可以使用多个列来定义复杂的检查约束。在使用多列检查约束时,要确保检查条件涵盖了所有相关列,并且能够正确地验证数据的完整性。
  • 4. 修改限制:修改检查约束可能会影响现有数据的一致性。如果要更改检查约束的条件,必须先删除原有的检查约束,然后重新创建新的检查约束。
  • 5. 性能影响:应谨慎使用复杂或耗时的检查条件,因为它们可能会对插入、更新和查询操作的性能产生影响。在设计和使用检查约束时,要平衡数据完整性和性能需求。
  • 6. 默认值冲突:如果存在默认值并且检查约束条件与默认值冲突,将无法插入或更新数据。确保检查约束的条件和默认值是兼容的,并且不会导致冲突。
  • 7. 特殊字符转义:如果检查约束条件包含特殊字符,如引号、百分号等,要进行适当的转义处理,以避免语法错误或意外行为。
  • 8. 跨表检查约束:检查约束可以跨多个表进行定义。在跨表检查约束时,要确保引用的表和列是正确的,并且能够满足数据完整性和业务规则的要求。

总结:

在使用检查约束时,要确保检查条件的准确性和完整性,合理命名约束,注意修改约束的影响和检查条件与默认值的兼容性。同时,要注意性能方面的考虑,并在需要的情况下进行特殊字符转义和跨表检查约束的定义。这样可以确保数据库中的数据满足业务规则和完整性要求。 

5.5默认约束(Default Constraint):

向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;

5.5.1验证默认约束:

向Employees1表插入新数据:

--插入数据(验证默认约束)
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID,  Salary,Email)
VALUES(4, 'tom', 'Min', 2, 8000,'Tom.doe@example.com')

执行结果如下: 

5.5.2注意事项:

使用默认约束时,需要注意以下几点:      

  • 1. 默认值选择:默认约束用于指定列在没有明确提供值时的默认值。在选择默认值时,要确保它符合业务规则,并且与列的数据类型兼容。
  • 2. NULL值处理:默认约束可以包含一个NULL值作为默认值。如果想要禁止列使用NULL值作为默认值,可以在创建表时或后续使用ALTER TABLE语句添加NOT NULL约束。
  • 3. 默认约束命名:给默认约束命名时,应选择有意义和描述性的名称,以提高代码的可读性和可维护性。通常使用"DF_"作为默认约束名称的前缀,以便于识别。
  • 4. 修改限制:修改默认约束可能会影响现有数据的一致性。如果要更改默认值,必须先删除原有的默认约束,然后重新创建新的默认约束。
  • 5. 多列默认约束:可以为多个列定义相同的默认约束。在使用多列默认约束时,要确保默认值在所有相关列上都是适用的,并且与数据类型兼容。
  • 6. 跨表默认约束:默认约束可以跨多个表进行定义。在跨表默认约束时,要确保引用的表和列是正确的,并且能够满足数据完整性和业务规则的要求。
  • 7. 性能影响:如果默认值涉及复杂计算或查询操作,可能会对插入和更新操作的性能产生影响。要谨慎选择默认值,避免过度复杂或耗时的操作。
  • 8. 默认约束的顺序:如果存在多个默认约束,并且有依赖关系,确保按正确的顺序创建这些约束,以避免依赖错误。

总结:

在使用默认约束时,要选择合适的默认值,注意NULL值的处理、命名约束、修改约束的影响和多列/跨表默认约束的定义。同时,要注意默认值的性能影响和约束的顺序,以确保数据库中的数据具有适当的默认值并满足业务规则。 

5.6非空约束(Not Null Constraint):

向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;

5.6.1验证非空约束:

--插入数据(验证非空约束)
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID,  Salary,Email)
VALUES(5, 'key', 'Maxx', 2, 7000,'key.doe@example.com')

执行结果如下: 

 插入正确数据进行观察:

--插入数据(验证非空约束)
INSERT INTO Employees1 (EmployeeID, FirstName, LastName, DepartmentID,  Salary,Email,Address)
VALUES(5, 'key', 'Maxx', 2, 7000,'key.doe@example.com','m')

执行结果如下: 

5.6.2注意事项:

使用非空约束时,需要注意以下几点:

  • 1. 列定义:非空约束用于限制列不允许为空值。在定义表结构时,需要明确指定哪些列需要应用非空约束。
  • 2. 默认值:如果未提供值且列具有默认值,则非空约束不会阻止插入操作。确保在设计表时,明确为不允许为空的列提供适当的默认值或规定其必须显式提供值。
  • 3. 修改限制:如果要将已具有数据的列更改为非空约束,必须先确定所有现有行都包含有效的值,然后才能添加非空约束。
  • 4. 空字符串:非空约束只针对空值(NULL),而不会限制空字符串。如果希望禁止空字符串,则需要使用非空约束和额外的检查约束来实现。
  • 5. 外键关系:在定义外键关系时,注意引用列是否允许为空。如果主表中的被引用列是非空约束,那么外键列也应该是非空约束,以确保引用完整性。
  • 6. 默认约束冲突:如果某个列既有非空约束又有默认约束,并且二者存在冲突,例如默认值为NULL,则会导致冲突。确保默认约束与非空约束兼容,以避免此类冲突。
  • 7. 数据完整性:非空约束可确保数据完整性,但需要注意在应用非空约束之前,已经存在的数据可能包含空值。在应用非空约束之后,需要确保现有数据符合约束条件。
  • 8. 修改数据:非空约束限制了对该列的更新和插入操作中的空值。确保在进行这些操作时,提供了非空的值,否则将违反非空约束。

总结:

在使用非空约束时,要注意对列的定义、默认值的处理,修改限制和数据完整性的考虑。同时,需要注意与外键关系和默认约束的兼容性,以确保数据库中的数据满足非空约束并保持一致性。

 六、约束参考学习

在Oracle学习过程中,我也总结梳理了一篇关于约束的相关笔记,篇名是【Oracle中的约束】,笔记链接如下:http://t.csdn.cn/e1hx6

其实SQL sever、Oracle、MySQL等数据库他们的约束没有特别大的区别,有异曲同工之妙,我们均可以参考学习,然后自己做个梳理汇总,渐渐的就能理解并熟练运用。

最后感谢大家的支持,文章如有错误还请指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14:00面试,14:06就出来了,这问的谁顶得住啊

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

CleanMyMac X版本4.14.2中文版新功能介绍

CleanMyMac X版本4.14.2中文版是一款专业的Mac清理工具&#xff0c;只需要一键智能清理&#xff0c;便能让Mac恢复原始的性能&#xff0c;是MAC系统非常好用的工具。CleanMyMac X自身拥有一个安全数据库&#xff0c;它是一个项目列表&#xff0c;拥有一定的规格&#xff0c;可以…

QT 绘画功能的时钟

.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> //信息调试类 #include <QPainter> #include <QPixmap> //图像引擎类 #include <QTime> #include <QTimer> …

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLA…

课题学习(二)----倾角和方位角的动态测量方法(基于磁场的测量系统)

磁性测量工具安装在非磁性钻铤内&#xff0c;如图1&#xff0c;以避免磁性随钻测量工具测量时受到外部干扰。 测量系统采用三轴加速度计和三轴磁通门&#xff0c;并采用冗余设计&#xff0c;由于井下振动剧烈&#xff0c;陀螺仪的可靠性将大大降低。为了保证整个钻井过程中系统…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

Linux计划任务

at 参数 日期时间&#xff1a;指定任务执行的日期时间。 在指定时间执行一个任务 -f&#xff1a;指定包含具体指令的任务文件&#xff1b; -q&#xff1a;指定新任务的队列名称&#xff1b; -l&#xff1a;显示待执行任务的列表&#xff1b; -d&#xff1a;删除指定的待执行…

9.2.4 【MySQL】段的结构

段不对应表空间中某一个连续的物理区域&#xff0c;而是一个逻辑上的概念&#xff0c;由若干个零散的页面以及一些完整的区组成。像每个区都有对应的XDES Entry来记录这个区中的属性一样&#xff0c;定义了一个INODE Entry结构来记录段中的属性。 它的各个部分释义如下&#xf…

JAVA自动化之Junit单元测试框架详解

一、JUnit概述&配置 1、Junit是什么&#xff1f; Junit是一个Java 编程语言的开源测试框架&#xff0c;用于编写和运行测试。官网 地址&#xff1a;https://junit.org/junit4/ 2、Maven配置 ?xml version"1.0" encoding"UTF-8"?> <project…

【大数据存储与处理】1. hadoop单机伪分布安装和集群安装

0. 写在前面 0.1 软件版本 hadoop2.10.2 ubuntu20.04 openjdk-8-jdk 0.2 hadoop介绍 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个…

pip install open-interpreter报错,无法安装

标题pip install open-interpreter报错&#xff0c;无法安装 ERROR: Could not find a version that satisfies the requirement open-interpreter (from versions: none) ERROR: No matching distribution found for open-interpreter 另外发现自己换了很多国内镜像源&#x…

【LeetCode热题100】--54.螺旋矩阵

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 按层遍历 可以将矩阵看成若干层&#xff0c;首先输出最外层的元素&#xff0c;其次输出次外层的元素&#xff0c;直到输出最内层的元素。 对于每层&…

CockroachDB集群部署

CockroachDB集群部署 1、CockroachDB简介 CockroachDB(有时简称为CRDB)是一个免费的、开源的分布式 SQL 数据库&#xff0c;它建立在一个事务性和强一致性的键 值存储之上。它由 PebbleDB(一个受 RocksDB/leveldb 启发的 K/B 存储库)支持&#xff0c;并使用 Raft 分布式共识…

JS进阶-函数剩余参数

函数参数的使用细节&#xff0c;能够提升函数应用的灵活度。 动态参数 arguments是函数内部内置的伪数组变量&#xff0c;它包含了调用函数时传入的所有实参&#xff0c;只存在于函数里 function getSum() {let sum 0for (let i 0; i < arguments.length; i) {sum arg…

性能测试之使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

9.19数电——触发器状态机第四周作业题解计数器(部分)

触发器 RS 1.输出置0 2.置1 3.输出保持不变 S&#xff1a;是置位信号&#xff0c;为1时说要置为1&#xff1b;为0时要置为0&#xff1b; R&#xff1a;是复位信号&#xff0c;为1时就要无条件置为0&#xff0c;为0时保持寄存器原状态 如果要置为0&#xff0c;必要条件…

uniapp——实现base64格式二维码图片生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.base64生成…

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…

2023-9-26 JZ 复杂链表的复制

题目链接&#xff1a;复杂链表的复制 import java.util.*; /* public class RandomListNode {int label;RandomListNode next null;RandomListNode random null;RandomListNode(int label) {this.label label;} } */ public class Solution {public RandomListNode Clone(Ra…

Docker 容器编排

是什么 Docker-Compose是 Docker 官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;写好多个…