1.创建基本表
CREATE TABLE dbo.Orders (
OrderID INT PRIMARY KEY, -- 主键
CustomerID INT, -- 客户ID
OrderDate DATETIME, -- 订单日期
ShipDate DATETIME, -- 发货日期
ShipAddress NVARCHAR(255), -- 发货地址
Status NVARCHAR(50) -- 订单状态
);
2.添加外键约束
外键约束用于确保表与表之间的关系。以下是如何在 SQL Server 中创建外键约束的详细步骤。
2.1. 创建一个参照关系(外键)约束
假设有两个表:Orders 和 Customers,Orders 表的 CustomerID 字段是 Customers 表的外键。
CREATE TABLE dbo.Customers (
CustomerID INT PRIMARY KEY, -- 客户ID
CustomerName NVARCHAR(100), -- 客户姓名
ContactName NVARCHAR(100) -- 联系人
);
CREATE TABLE dbo.Orders (
OrderID INT PRIMARY KEY, -- 订单ID
CustomerID INT, -- 客户ID
OrderDate DATETIME, -- 订单日期
ShipAddress NVARCHAR(255), -- 发货地址
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID) -- 外键指向 Customers 表的 CustomerID
);
2.2. 外键约束的附加选项
ON DELETE CASCADE: 当主表的记录被删除时,相关的外键记录也会被删除。
ON UPDATE CASCADE: 当主表的记录更新时,相关的外键记录会被更新。
CREATE TABLE dbo.Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATETIME,
ShipAddress NVARCHAR(255),
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID)
ON DELETE CASCADE -- 删除时级联删除外键记录
ON UPDATE CASCADE -- 更新时级联更新外键记录
);
2.3. 外键约束的条件
外键可以具有删除限制或更新限制,这些限制会在外键被删除或更新时发生:
ON DELETE NO ACTION: 如果删除主表记录时有相关的外键记录,操作会被拒绝。默认值。
ON DELETE SET NULL: 当主表记录删除时,外键字段会被设置为 NULL。
CREATE TABLE dbo.Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATETIME,
ShipAddress NVARCHAR(255),
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID)
ON DELETE SET NULL -- 删除时将外键字段设为 NULL
);
2.4. 外键约束中的检查条件
有时,外键约束可以包含检查条件,例如,确保引用的记录符合特定条件。以下是一个示例:
CREATE TABLE dbo.Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATETIME,
ShipAddress NVARCHAR(255),
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT CHK_OrderDate CHECK (OrderDate > '2020-01-01') -- 检查订单日期
);
2.5. 自定义外键约束
有时,可能需要在外键约束中使用多列。例如,Orders 表可能包含多个外键,且需要共同作用:
CREATE TABLE dbo.OrderDetails (
OrderDetailID INT PRIMARY KEY,
OrderID INT,
ProductID INT,
Quantity INT,
CONSTRAINT FK_Order FOREIGN KEY (OrderID)
REFERENCES dbo.Orders(OrderID),
CONSTRAINT FK_Product FOREIGN KEY (ProductID)
REFERENCES dbo.Products(ProductID)
);
3. 创建带有多重外键约束的表
如果表涉及多个外键关系,可以按以下方式进行设置:
CREATE TABLE dbo.Products (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(100),
CategoryID INT
);
CREATE TABLE dbo.Categories (
CategoryID INT PRIMARY KEY,
CategoryName NVARCHAR(100)
);
CREATE TABLE dbo.OrderDetails (
OrderDetailID INT PRIMARY KEY,
OrderID INT,
ProductID INT,
Quantity INT,
CONSTRAINT FK_Order FOREIGN KEY (OrderID)
REFERENCES dbo.Orders(OrderID),
CONSTRAINT FK_Product FOREIGN KEY (ProductID)
REFERENCES dbo.Products(ProductID),
CONSTRAINT FK_Category FOREIGN KEY (CategoryID)
REFERENCES dbo.Categories(CategoryID)
);
4. 外键约束的管理
4.1. 删除外键约束
如果需要删除外键约束,可以使用 ALTER TABLE 删除:
ALTER TABLE dbo.Orders
DROP CONSTRAINT FK_CustomerOrder;
4.2. 修改外键约束
SQL Server 不允许直接修改外键约束。如果要修改外键约束,必须先删除它,然后重新创建新的外键。
ALTER TABLE dbo.Orders
DROP CONSTRAINT FK_CustomerOrder;
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID);
在 SQL Server 中,外键约束通过 FOREIGN KEY 关键字创建,并且可以包括多种附加选项,如级联删除、级联更新、删除时设为 NULL 等。可以根据需要选择合适的约束方式来确保数据的完整性和一致性。