当前位置:网站首页>SQL Server 知识汇集11 : 约束
SQL Server 知识汇集11 : 约束
2022-07-07 08:31:00 【꧁小ۣۖิ鸽ۣۖิ子ۣۖิ꧂】
1.SQL Server主键约束
PRIMARY KEY简介
主键是唯一标识表中每一行的列或一组列。可以使用 PRIMARY KEY 约束为表创建主键。 如果主键只包含一列,则可以将 PRIMARY KEY 约束定义为列约束:
CREATE TABLE table_name (
pk_column data_type PRIMARY KEY,
...
);
如果主键有两列或更多列,则必须使用 PRIMARY KEY 约束作为表约束:
CREATE TABLE table_name (
pk_column_1 data_type,
pk_column_2 data type,
...
PRIMARY KEY (pk_column_1, pk_column_2)
);
每个表只能有一个主键。参与主键的所有列必须定义为 NOT NULL
如果没有为这些列指定 NOT NULL 约束,SQL Server会自动为所有主键列设置 NOT NULL 约束。
在创建主键时,SQL Server还会自动创建唯一的聚簇索引(如果指定,则为非聚集索引)。
PRIMARY KEY约束示例
以下示例创建一个包含主键的表,该主键包含一列:
CREATE TABLE sales.activities (
activity_id INT PRIMARY KEY IDENTITY,
activity_name VARCHAR (255) NOT NULL,
activity_date DATE NOT NULL
);
在此 sales.activities 表中, activity_id 列是主键列。 activity_id 列包含唯一值。
IDENTITY 属性用于 activity_id 列以自动生成唯一的整数值。
以下语句创建一个名为 sales.participants 的新表,其主键由两列组成:
CREATE TABLE sales.participants(
activity_id int,
customer_id int,
PRIMARY KEY(activity_id, customer_id)
);
在此示例中, activity_id 或 customer_id 列中的值可以重复,但两列中的每个值组合必须是唯一 的。
通常,表始终具有在创建时定义的主键。 但是,有时,现有表可能由于某种原因而没有定义主键。
在这种情况下,可以使用 ALTER TABLE 语句向表中添加主键。
请考虑以下示例。 以下语句创建没有主键的表:
CREATE TABLE sales.events(
event_id INT,
event_name VARCHAR(255),
start_date DATE NOT NULL,
duration DEC(5,2)
);
要将 event_id 列作为主键,请使用以下 ALTER TABLE 语句:
ALTER TABLE sales.events
ADD PRIMARY KEY(event_id);
2.SQL Server外键约束
SQL Server外键约束简介
外键是一个表中的一列或一组列,它唯一地标识另一个表的行。
vendor_groups 和v endor 表,它们的结构如下:
CREATE TABLE procurement.vendor_groups (
group_id INT IDENTITY PRIMARY KEY,
group_name VARCHAR (100) NOT NULL
);
CREATE TABLE procurement.vendors (
vendor_id INT IDENTITY PRIMARY KEY,
vendor_name VARCHAR(100) NOT NULL,
group_id INT NOT NULL,
);
每个供应商属于供应商组,每个供应商组可能有零个或多个供应商。 vendor_groups 和 vendors 表之 间的关系是一对多的。
对于 vendors 表中的每一行,始终可以在 vendor_groups 表中找到相应的行。
但是,如果使用当前表创建方式,可以在 vendors 表中插入一行而不在 vendor_groups 表中显示相应 的行。
还可以删除 vendor_groups 表中的行,而无需更新或删除 vendors 表中导致 vendors 表中存在孤立的 行。
要强制执行 vendor_groups 和 vendors 表中的数据之间的链接,需要在 vendors 表中建立外键。
要创建外键,请使用 FOREIGN KEY 约束。
以下语句删除 vendors 表并使用 FOREIGN KEY 约束重新创建它:
DROP TABLE vendors;
CREATE TABLE procurement.vendors (
vendor_id INT IDENTITY PRIMARY KEY,
vendor_name VARCHAR(100) NOT NULL,
group_id INT NOT NULL,
CONSTRAINT fk_group FOREIGN KEY (group_id)
REFERENCES procurement.vendor_groups(group_id)
);
现在, vendor_groups 表称为父表,该表是外键约束引用的表。 vendors 表称为子表,该表是应用外 键约束的表。
在上面的语句中,以下子句创建名为 fk_grou p的 FOREIGN KEY 约束,该约束将 vendors 表中的 group_id 链接到 vendor_groups 表中的 group_id :
CONSTRAINT fk_group FOREIGN KEY (group_id) REFERENCES
procurement.vendor_groups(group_id)
SQL
FOREIGN KEY约束语法
创建 FOREIGN KEY 约束的一般语法如下:
CONSTRAINT fk_constraint_name
FOREIGN KEY (column_1, column2,...)
REFERENCES parent_table_name(column1,column2,..)
下面来详细学习一下这种语法。
首先,在 CONSTRAINT 关键字后指定 FOREIGN KEY 约束名称。约束名称是可选的(不用指定也可以),因 此可以按如下方式定义 FOREIGN KEY 约束:
FOREIGN KEY (column_1, column2,...)
REFERENCES parent_table_name(column1,column2,..)
在这种情况下,SQL Server将自动为 FOREIGN KEY 约束生成名称。
其次,在 FOREIGN KEY 关键字后面指定括号括起来的逗号分隔外键列的列表。
第三,指定外键引用的父表的名称以及与子表中的列具有链接的逗号分隔列的列表。
FOREIGN KEY约束示例
首先,在 vendor_groups 表中插入一些行:
INSERT INTO procurement.vendor_groups(group_name)
VALUES('第三方供应商'),
('优品供应商'),
('一次性供应商');
其次,将具有供应商组的新供应商插入 vendors 表:
INSERT INTO procurement.vendors(vendor_name, group_id)
VALUES('ABC Corp', 1);
上面语句按预期工作。
第三,尝试插入 vendor_groups 表中不存在供应商组的新供应商:
INSERT INTO procurement.vendors(vendor_name, group_id)
VALUES('XYZ Corp',4);
SQL Server发出以下错误:
The INSERT statement conflicted with the FOREIGN KEY constraint "fk_group".
The conflict occurred in database "BikeStores", table
"procurement.vendor_groups", column 'group_id'.
在此示例中,由于 FOREIGN KEY 约束, vendor_groups 表中 group_id 列的值为 4 的行不存在。因此 SQL Server拒绝插入并发出错误。
参考操作
外键约束确保了引用完整性。如果父表中存在相应的行,则只能在子表中插入一行。
此外,外键约束用 于在更新或删除父表中的行时定义引用操作,如下所示:
FOREIGN KEY (foreign_key_columns)
REFERENCES parent_table(parent_key_columns)
ON UPDATE action
ON DELETE action;
ON UPDATE 和 ON DELETE 指定在更新和删除父表中的行时将执行的操作。 以下是允许的操作: NO ACTION , CASCADE , SET NULL 和 SET DEFAULT 。
删除父表中行的操作
如果删除父表中的一行或多行,则可以设置以下操作之一:
ON DELETE NO ACTION :SQL Server引发错误并回滚父表中行的删除操作。
ON DELETE CASCADE :SQL Server删除子表中与从父表中删除的行相对应的行。
ON DELETE SET NULL :如果删除父表中的相应行,则SQL Server将子表中的行设置为 NULL 。 要执行此操作,外键列必须可为 NULL 。
ON DELETE SET DEFAULT :如果删除父表中的相应行,SQL Server会将子表中的行设置为其默认 值。 要执行此操作,外键列必须具 有默认定义。 请注意,如果未指定默认值,则可空列的默认值为 NULL 。
默认情况下,如果未明确指定任何操作,则SQL Server将应用 ON DELETE NO ACTION 。
更新父表中行的操作
如果更新父表中的一行或多行,则可以设置以下操作之一:
- ON UPDATE NO ACTION :SQL Server引发错误并回滚父表中行的更新操作。
- ON UPDATE CASCADE :当父表中的行更新时,SQL Server更新子表中的相应行。
- ON UPDATE SET NULL :当更新父表中的相应行时,SQL Server将子表中的行设置为NULL。 请注 意,外键列必须可以为空以便执行 此操作。
- ON UPDATE SET DEFAULT :SQL Server为子表中的行设置默认值,这些行更新了父表中的相应 行。
3.SQL Server Not Null约束
SQL Server NOT NULL约束简介
SQL Server NOT NULL 约束只是指定列不能为 NULL 值。
以下示例为列创建一个具有 NOT NULL 约束的表: persons ,它具有以下几个字段: first_name , last_name 和 email :
CREATE SCHEMA hr;
GO
CREATE TABLE hr.persons(
person_id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20)
);
请注意,上面几列中,将 NOT NULL 约束作为列约束。
默认情况下,如果未指定 NOT NULL 约束,则SQL Server将允许该列接受 NULL 。
在此示例中,只有 phone 列可以接受 NULL 。
1.将NOT NULL约束添加到列
要将 NOT NULL 约束添加到现有列,可以分两步执行:
首先,更新表的值,以便列中没有 NULL 值:
UPDATE table_name
SET column_name = <new_value>
WHERE column_name IS NULL;
其次,更改表以更改列的属性:
ALTER TABLE table_name
ALTER COLUMN column_name data_type NOT NULL;
例如,要将 NOT NULL 约束添加到 hr.persons 表的 phone 列,请使用以下语句。
首先,如果某些人员没有电话号码,则将电话号码更新为公司电话号码,例如, 0898-88889999 :
UPDATE hr.persons
SET phone = "0898-88889999"
WHER phone IS NULL;
第二步,修改 phone 列的属性为 NOT NULL :
ALTER TABLE hr.persons
ALTER COLUMN phone VARCHAR(20) NOT NULL;
2.删除NOT NULL约束
要从列中删除 NOT NULL 约束,请使用 ALTER TABLE ALTER COLUMN 语句,如下所示:
ALTER TABLE table_name
ALTER COLUMN column_name NULL;
例如,要从 phone 列中删除 NOT NULL 约束,请使用以下语句:
ALTER TABLE hr.pesons
ALTER COLUMN phone NULL;
边栏推荐
- Basic introduction of yarn and job submission process
- [detailed explanation of Huawei machine test] tall and short people queue up
- Gym installation pit records
- P2788 数学1(math1)- 加减算式
- Some superficial understanding of word2vec
- 使用Tansformer分割三维腹部多器官--UNETR实战
- 555 circuit details
- Why is the reflection efficiency low?
- openinstall与虎扑达成合作,挖掘体育文化产业数据价值
- Mendeley--免费的文献管理工具,给论文自动插入参考文献
猜你喜欢
leetcode-560:和为 K 的子数组
Some properties of leetcode139 Yang Hui triangle
ThreadLocal会用可不够
1323:【例6.5】活动选择
[higherhrnet] higherhrnet detailed heat map regression code of higherhrnet
Leetcode-304: two dimensional area and retrieval - matrix immutable
XML configuration file parsing and modeling
Adb 实用命令(网络包、日志、调优相关)
Multithreaded asynchronous orchestration
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
随机推荐
Five simple and practical daily development functions of chrome are explained in detail. Unlock quickly to improve your efficiency!
5个chrome简单实用的日常开发功能详解,赶快解锁让你提升更多效率!
Jump to the mobile terminal page or PC terminal page according to the device information
The mobile terminal automatically adjusts the page content and font size by setting rem
The variables or functions declared in the header file cannot be recognized after importing other people's projects and adding the header file
移动端通过设置rem使页面内容及字体大小自动调整
浅谈日志中的返回格式封装格式处理,异常处理
Gym installation pit records
Study summary of postgraduate entrance examination in August
About hzero resource error (groovy.lang.missingpropertyexception: no such property: weight for class)
深入理解Apache Hudi异步索引机制
1323: [example 6.5] activity selection
Study summary of postgraduate entrance examination in November
对word2vec的一些浅层理解
Using U2 net deep network to realize -- certificate photo generation program
P1031 [NOIP2002 提高组] 均分纸牌
关于easyflash v3.3使用过程的记录
How embedded engineers improve work efficiency
【作业】2022.7.6 写一个自己的cal函数
Experience sharing of software designers preparing for exams