首页 > 数据库 >SQL Server给表添加及删除主键Primary Key及默认值Default约束

SQL Server给表添加及删除主键Primary Key及默认值Default约束

时间:2024-08-10 11:24:42浏览次数:16  
标签:给表 Employees object 约束 TABLE 默认值 主键

1. 添加表的主键(Primary Key)和默认值(Default)约束

在SQL Server中,给表添加主键(Primary Key)及默认值(Default)约束是数据库设计和维护中常见的操作。这些操作可以通过ALTER TABLE语句在表已存在的情况下执行,也可以通过CREATE TABLE语句在创建表时直接指定。下面分别介绍这两种情况下的操作方法。

1.1 使用ALTER TABLE语句

1.1.1 添加主键约束

假设有一个表Employees,你想将EmployeeID列设置为主键。首先,确保EmployeeID列中的每个值都是唯一的,并且没有NULL值。然后,你可以使用以下SQL语句来添加主键约束:

ALTER TABLE Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID);

这里,PK_Employees是主键约束的名称,你可以根据需要自定义。EmployeeID是你要设置为主键的列名。

1.1.2 添加默认值约束

如果你想给Employees表的HireDate列设置一个默认值(例如,当前日期),你可以使用以下SQL语句:

ALTER TABLE Employees
ADD CONSTRAINT DF_Employees_HireDate DEFAULT GETDATE() FOR HireDate;

这里,DF_Employees_HireDate是默认值约束的名称,GETDATE()是一个SQL Server函数,用于获取当前的日期和时间。HireDate是你要添加默认值约束的列名。

1.2 使用CREATE TABLE语句

在创建新表时,你也可以直接在列定义中指定主键和默认值约束。

CREATE TABLE Employees (
    EmployeeID INT NOT NULL,
    Name NVARCHAR(100),
    HireDate DATE constraint df_Employees_HireDate DEFAULT GETDATE(),
    CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID)
);

在这个例子中,EmployeeID列被定义为NOT NULL,并且直接在表定义中指定了主键约束PK_Employees。同时,HireDate列被定义为具有默认值GETDATE()

sys.key_constraints和sys.default_constraints系统视图分别提供了关于主键约束和默认值约束的更多详细信息。

-- 主键约束
select name,parent_object_id,object_name(parent_object_id) as table_name,type
from sys.key_constraints 
where parent_object_id=object_id('Employees');

-- 默认值约束
select name,parent_object_id,object_name(parent_object_id) as table_name,type
from sys.default_constraints
where parent_object_id=object_id('Employees');

1.3 注意事项

  • 主键约束自动确保列中的每个值都是唯一的,并且不允许NULL值。
  • 默认值约束在插入新行时没有为列提供值时,自动为列提供指定的值。
  • 在添加主键约束之前,确保列中没有重复的值和NULL值。
  • 约束名称(如PK_EmployeesDF_Employees_HireDate)在数据库中必须是唯一的,但它们可以根据你的偏好进行自定义。
  • 使用ALTER TABLE语句时,如果表已经存在数据,添加主键约束时必须确保该列中没有重复值或NULL值,否则操作将失败。

2. 删除表的主键(Primary Key)和默认值(Default)约束

在SQL Server中,删除表的主键(Primary Key)和默认值(Default)约束需要使用ALTER TABLE语句配合DROP CONSTRAINT子句。以下是如何执行这些操作的示例。

2.1 删除主键约束

要删除表的主键约束,你首先需要知道该主键约束的名称。这个名称在创建主键时指定,如果你不记得了,可以通过查询系统表(如INFORMATION_SCHEMA.TABLE_CONSTRAINTSsys.key_constraints)来查找。

假设主键约束的名称为PK_Employees,你可以使用以下SQL语句来删除它:

ALTER TABLE Employees
DROP CONSTRAINT PK_Employees;

2.2 删除默认值约束

同样地,要删除默认值约束,你也需要知道该约束的名称。假设默认值约束的名称为DF_Employees_HireDate,你可以使用以下SQL语句来删除它:

ALTER TABLE Employees
DROP CONSTRAINT DF_Employees_HireDate;

2.3 查找约束名称

如果你不知道要删除的约束的确切名称,可以通过查询系统表来查找。以下是一个使用INFORMATION_SCHEMA.TABLE_CONSTRAINTS视图的例子,该视图列出了数据库中所有表的约束信息:

SELECT 
    CONSTRAINT_NAME, 
    CONSTRAINT_TYPE
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE 
    TABLE_NAME = 'Employees' AND TABLE_SCHEMA = 'dbo'; -- 替换为你的表名和模式名

如果你想要查找特定类型的约束(如主键或默认值),可以在WHERE子句中添加额外的条件来筛选CONSTRAINT_TYPE

另外,sys.key_constraintssys.default_constraints系统视图分别提供了关于主键约束和默认值约束的更多详细信息。你可以根据需要查询这些视图来获取约束的名称和其他相关信息。

-- 主键约束
select name,parent_object_id,object_name(parent_object_id) as table_name,type
from sys.key_constraints 
where parent_object_id=object_id('Employees');
-- 默认值约束
select name,parent_object_id,object_name(parent_object_id) as table_name,type
from sys.default_constraints
where parent_object_id=object_id('Employees');

2.4 注意事项

  • 在删除主键约束之前,请确保这不是你数据库逻辑中依赖的关键部分,因为删除它可能会破坏数据完整性和外键关系。
  • 删除默认值约束后,如果在插入新行时没有为受影响的列提供值,该列将接受其数据类型的默认值(如果有的话),否则可能会违反NOT NULL约束(如果列被定义为NOT NULL且没有默认值)。
  • 始终在执行此类操作之前备份你的数据,以防万一需要恢复。

标签:给表,Employees,object,约束,TABLE,默认值,主键
From: https://blog.csdn.net/zxrhhm/article/details/141033929

相关文章

  • 分布式主键 详解
    文章目录雪花算法结合分库分表的问题问题出现原因分析解决思路分布式主键要考虑的问题主键生成策略雪花算法详解时间戳位问题工作进程位问题序列号位问题根据雪花算法扩展基因分片法雪花算法结合分库分表的问题问题出现使用ShardingSphere框架自带的雪花算法生成......
  • Mybatis-Plus源码-自增主键填充到实体
     #mybatis-3.5.10+mybatisPlus-3.5.2#mybatis-plus自增id策略下何时填充id到实体com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveOrUpdatecom.baomidou.mybatisplus.extension.service.IService#savecom.baomidou.mybatisplus.core.override.M......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 【MySQL】MySQL基础知识:什么是主键?什么是外键?主键和外键有什么区别?外键有什么问题?
    在关系型数据库系统中,如MySQL,主键(PrimaryKey)和外键(ForeignKey)是两个基本且重要的概念,它们在数据库设计和数据维护中扮演着重要的角色。本文将从主键和外键的基本概念入手,详细解析它们之间的区别,并探讨外键在实际应用中可能遇到的问题。......
  • MySQL Sink 是否需要主键
    需要主键的情况:更新和删除操作:如果你希望MySQL表能够正确处理更新和删除操作,那么表中需要定义主键。主键用于唯一标识每一行数据,这样当Flink发送撤回消息(删除操作)或添加消息(更新操作)时,MySQL能够准确地找到并更新或删除对应的记录。数据一致性:主键有助于确保数据的一致性......
  • 第五讲:全局锁和表锁 :给表加个字段怎么有这么多阻碍?
    目录第五讲:全局锁和表锁:给表加个字段怎么有这么多阻碍?引言:锁的分类:全局锁场景:弊端:好处分析:回顾:提出问题:问题一:问题二:表级锁表锁:元数据锁(MDL)案例:变故发生:基于案列说问题:操作小结提问:官方:我的理解(片面了):深入:第五讲:全局锁和表锁:给表加个字段怎么有这么多阻碍?引言:​ 今天我要......
  • 如何使 argparse 与枚举和默认值完美配合?
    我有一个枚举:fromenumimportauto,EnumclassMyEnum(Enum):ONE=auto()TWO=auto()THREE=auto(),我想将它用作argparse的参数。更具体地说,我想创建一个接受枚举名称之一("one","two","three")并且可能具有默认值的参数,并且相......
  • Oracle(12)什么是主键(Primary Key)?
    主键(PrimaryKey)是数据库表中的一个或多个列,它们的值唯一地标识表中的每一行。主键具有以下特点:唯一性(Uniqueness):主键的每个值在表中必须是唯一的,不能重复。非空性(NotNull):主键列的值不能为空(NULL)。单一性(SingleColumnorCompositeKey):主键可以是单个列,也可以是由多个列......
  • mybatis 插入时 返回主键
    在MyBatis中,如果你希望在插入数据时返回主键值,可以通过在<insert>标签中使用useGeneratedKeys="true"属性和keyProperty属性来实现。useGeneratedKeys属性表示使用数据库生成的主键,而keyProperty属性则指定用来接收这个生成主键的属性名。以下是一个简单的例子:假设你有一个用户......
  • Postgresql主键自增的方法
    Postgresql主键自增的方法一.方法(一)使用 serialPRIMARYKEY插入数据 二.方法(二)......