当前位置:网站首页>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;
边栏推荐
- 枪出惊龙,众“锁”周之
- 2022.7.6DAY598
- MySQL insert data create trigger fill UUID field value
- Sword finger offer 38 Arrangement of strings [no description written]
- 1323: [example 6.5] activity selection
- IIC基本知识
- 无法打开内核设备“\\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导? 模块“DevicePowerOn”启动失败。 未能启动虚拟机。
- CC2530 zigbee IAR8.10.1环境搭建
- 路由器开发知识汇总
- Trajectory planning for multi-robot systems: Methods and applications 综述阅读笔记
猜你喜欢
【STM32】STM32烧录程序后SWD无法识别器件的问题解决方法
XML configuration file parsing and modeling
JMeter loop controller and CSV data file settings are used together
[sword finger offer] 42 Stack push in and pop-up sequence
php \n 换行无法输出
Yarn的基础介绍以及job的提交流程
高级软考(网络规划设计师)该如何备考?
IO模型复习
Application of OpenGL gllightfv function and related knowledge of light source
CAS机制
随机推荐
Trajectory planning for multi robot systems: methods and Applications Overview reading notes
深入分析ERC-4907协议的主要内容,思考此协议对NFT市场流动性意义!
Trajectory planning for multi-robot systems: Methods and applications 综述阅读笔记
Applet jump to H5, configure business domain name experience tutorial
IO模型复习
想考中级软考,一般需要多少复习时间?
Leetcode-560: subarray with sum K
Multithreaded asynchronous orchestration
Summary of router development knowledge
How embedded engineers improve work efficiency
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
嵌入式工程师如何提高工作效率
Study summary of postgraduate entrance examination in September
BigDecimal value comparison
Study summary of postgraduate entrance examination in July
Pre knowledge reserve of TS type gymnastics to become an excellent TS gymnastics master
多线程-异步编排
【作业】2022.7.6 写一个自己的cal函数
mysql插入数据创建触发器填充uuid字段值
JS实现链式调用