SQL sever中的约束

news2025/1/23 4:57:55

目录

一、约束定义

二、约束分类

三、定义约束

四、约束相关语法格式

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 TableName
     ADD 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 Count
     FROM Employees1
     GROUP BY Email
     HAVING 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.coloradmin.cn/o/1043621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常用的文本对比工具或网站

以下是一些常用的文本对比工具的下载地址或网站访问地址&#xff1a; DiffNow: https://www.diffnow.com/ WinMerge: https://winmerge.org/ Beyond Compare: https://www.scootersoftware.com/ Meld: https://meldmerge.org/ diff:文本对比/字符串差异比较 - 在线工具 请…

解决仪器掉线备忘

网络管控越来越严格&#xff0c;老的Mac模式连接的仪器经常断开&#xff0c;要么是网络没活动被断开TCP了&#xff0c;要么是网络波动无法保持TCP。每次重启仪器控制很麻烦&#xff0c;基于之前用M写http服务的基础上改进仪器接口连接。 参照之前实现http服务的逻辑 最终逻辑 …

用CNC网关推动工业自动化革命

在当今的工业自动化领域&#xff0c;机床&#xff08;CNC&#xff0c;计算机数值控制&#xff09;已成为制造业的重要支柱。然而&#xff0c;这些复杂的设备在数据收集、通信和集成方面通常面临诸多挑战。其中&#xff0c;CNC转Modbus网关为解决这些问题提供了有效的解决方案。…

Vue+ElementUI实现动态树和表格数据的查询

目录 前言 一、动态树的实现 1.数据表 2.编写后端controller层 3.定义前端发送请求路径 4.前端左侧动态树的编写 4.1.发送请求获取数据 4.2.遍历左侧菜单 5.实现左侧菜单点击展示右边内容 5.1.定义组件 5.2.定义组件与路由的对应关系 5.3.渲染组件内容 5.4.通过动态…

Linux0.11——操作系统怎么把自己从硬盘搬到内存

这里先直接给出答案&#xff1a;中断 此时&#xff0c;操作系统用短短几行代码&#xff0c;将数据段寄存器ds和代码段寄存器cs设置为了0x9000&#xff0c;方便之后的程序访问代码和数据&#xff0c;并且将栈顶地ss:sp设置在了远离代码的位置0x9000足够遥远的0x9FF00&#xff0c…

Lesson08---string

lesson11: 一、 1.string大概有多少个接口函数&#xff1f;&#xff08;3&#xff1a;2&#xff1a;25&#xff09; 2.string在C库的reference的XX&#xff08;3&#xff1a;3&#xff1a;47&#xff09; a.我们平时用的string是下面的哪一个&#xff1f;&#xff08;3&…

2、Linux中静态IP与动态IP的修改

修改为静态IP 打开文件 sudo vim /etc/network/interfaces修改如下 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto ens33#配置网络为DHCP模式 #iface ens33 inet dhcp#配置网络 ens33为静态IP模式 iface ens33 inet static #设置…

什么才是物联网领域最好的开发语言?

什么才是物联网领域最好的开发语言&#xff1f; 最好&#xff01;运行最快&#xff1f;开发最高效&#xff1f;最容易学习&#xff1f; 各有特点&#xff01; 采用C/C语言&#xff0c;运行最快&#xff0c;一般采用厂家提供的底层驱动支持包BSP&#xff0c;所有MCU都支持。如…

DKD蒸馏复现

知识蒸馏主要分两类&#xff1a; 1&#xff1a;基于logits 2&#xff1a;基于feature logits蒸馏主要是在早期&#xff0c;后期效果逐步被基于feature蒸馏超越。 cvpr2022的DKD基于传统的KD进行改进&#xff0c;重铸logits蒸馏的荣光。目前很多蒸馏都采用DKD方案&#xff0…

通俗易懂经典的黑客入门教程

第一节、黑客的种类和行为 以我的理解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事…

一维卷积神经网络

假设输入数据维度为8&#xff0c;filter维度为5&#xff1b; 不加padding时&#xff0c;输出维度为4&#xff0c;如果filter的数量为16&#xff0c;那么输出数据的shape就是4*16. 一维卷积不代表卷积核只有一维&#xff0c;也不代表被卷积的feature也是一维。一维的意思是说卷…

Pytorch CUDA11.4版本匹配

1.查看CUDA&#xff0c;并查找对应的torch的版本 首先判断自己是否适合使用GPU版本的torch&#xff0c;打开自己的cmd输入 NVIDIA-smi CUDA11.4版本比较特殊的版本&#xff0c;可以用CUDA11.3版本 2.下载orch、torchvision、torchaudio(三者版本要相关) 知道pytorch可以下载…

Day57:组件库封装-1

封装element组件 参考对象 折叠面板 按钮 npm create vue3 npm i 使用vue3建库如果报错可以尝试禁用vs的 vetur 插件&#xff0c;这是vue2插件&#xff0c;会给vue3项目报错(禁用了之后需要重新加载 src新建components文件夹 下面新建Button文件夹&#xff0c;新建vue&…

9月19-21日上课内容 zabbix监控系统与部署Zabbix5.0监控

本章结构 前言 监控软件的作用 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; ●通过一个友好的界面进行浏览整…

什么是单片机最小系统?

大家好&#xff0c;我是山羊君Goat。 对于单片机来说&#xff0c;它是一种电子编程器件&#xff0c;可以实现很多多样的功能&#xff0c;常见的单品机有51&#xff0c;STM32等等。 单片机&#xff08;single-chip Microcomputer&#xff09;&#xff0c;是一种集成电路芯片&am…

云服务器 CentOS7 操作系统上安装Jpress (Tomcat 部署项目)

1、xShell 和 xftp 下载安装&#xff08;略&#xff09; https://www.xshell.com/zh/free-for-home-school/2、xftp 连接云服务器 xftp 新建连接 3、JDK 压缩包下载 下载 jdk1.8 注&#xff1a;此处 CentOS7 是64位&#xff0c;所以下载的是&#xff1a;Linux x64&#xf…

CSAPP的Lab学习——ProxyLab

文章目录 前言一、第一部分&#xff1a;实现一个顺序的web代理HTTP/1.0 GET请求请求标头端口号 二、第二部分&#xff1a;处理多个并发请求三、第三部分&#xff1a;缓存web对象最大缓存大小最大对象大小驱逐政策同步 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招…

打点初级技巧

什么是打点&#xff1f; 打点的目的获取一个服务器的控制权限。获得一个webshell。 步骤 如果你拿到一个网站的名字&#xff0c;该如何进行打点呢&#xff1f;首先&#xff0c;在天眼查上查询该网站&#xff0c;进入查询到的官网&#xff1a; 天眼查-商业查询平台_企业信息查…

48v转24v 3A 48v转12v 48v转5v电源芯片AH7691X

AH7691X是一款高-效-率、高-压降压型DC-DC转换器&#xff0c;采用固定110KHz的开关频率&#xff0c;具备3A的输出电流能力&#xff0c;低纹波&#xff0c;并且具备***软启动功能、过压保护功能和温度保护。该器件还集成了峰值限流功能&#xff0c;简化了电路设计。 AH7691X内部…

2023 年热门的大型语言模型 (LLMs)汇总【更新至9月26】

一、全景地图 整理了一张大语言模型的血缘图谱&#xff0c;如下图所示&#xff1a; 图中的大语言模型&#xff0c;都是自己做过评测的&#xff0c;主观了点&#xff0c;但是原汁原味&#xff0c;有好的可以推荐给我。 二、ChatGPT系列 ChaTGP是商业版本大语言模型的正统&…