1.下面尝试删除 supplier_groups 表:

DROP TABLE procurement.supplier_groups;

SQL Server发出以下错误:

Could not drop object 'procurement.supplier_groups' because it is referenced
by a FOREIGN KEY constraint.

SQL Server不允许删除外部约束引用的表。

要删除此表,必须先删除引用外键约束或引用表。

在这种情况下,必须先删除 supplier 表或 supplier 表中的外键约束,然后再删除 supplier_groups 表。

DROP TABLE procurement.supplier_groups;
DROP TABLE procurement.suppliers;

如果使用单个 DROP TABLE 语句删除两个表,则必须将引用表放在前面,如下面的查询所示:

DROP TABLE procurement.suppliers, procurement.supplier_groups;

2. SQL Server截断表

TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句。

但是, TRUNCATE 语句执行得更快,并且使 用的系统和事务日志资源更少。

TRUNCATE TABLE与DELETE比较 与 DELETE 语句相比, TRUNCATE TABLE 具有以下优点:

1. 使用较少的事务日志

DELETE 语句一次删除一行,并在事务日志中为每个删除的行插入一个条目。

另一方面, TRUNCATE TABLE 语句通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中插 入页面解除分配。

2. 使用更少的锁

使用行锁执行 DELETE 语句时,表中的每一行都被锁定以便删除。 TRUNCATE TABLE 锁定表和页,而不 是每一行。

3. 标识重置

如果要截断的表具有标识列,则当使用 TRUNCATE TABLE 语句删除数据后,具有标识列的计数器将重置 为开始的值(一般是: 1 )。

4.. 约束

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

5.. 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 表称为子表,该表是应用外 键约束的表。

在上面的语句中,以下子句创建名为 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,..)

 

 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