了解一个表的主键如何也可以是外键

时间:2014-11-10 02:41:44

标签: sql sql-server

我收到了以下代码:


- 创建客户表

CREATE TABLE Customers
(
cust_id      char(10)  NOT NULL ,
cust_name    char(50)  NOT NULL ,
cust_address char(50)  NULL ,
cust_city    char(50)  NULL ,
cust_state   char(5)   NULL ,
cust_zip     char(10)  NULL ,
cust_country char(50)  NULL ,
cust_contact char(50)  NULL ,
cust_email   char(255) NULL 
);

- 创建OrderItems表

CREATE TABLE OrderItems
(
order_num  int          NOT NULL ,
order_item int          NOT NULL ,
prod_id    char(10)     NOT NULL ,
quantity   int          NOT NULL ,
item_price decimal(8,2) NOT NULL 
);

- 创建订单表

CREATE TABLE Orders
(
order_num  int      NOT NULL ,
order_date datetime NOT NULL ,
cust_id    char(10) NOT NULL 
);

- 创建产品表

CREATE TABLE Products
(
prod_id    char(10)      NOT NULL ,
vend_id    char(10)      NOT NULL ,
prod_name  char(255)     NOT NULL ,
prod_price decimal(8,2)  NOT NULL ,
prod_desc  varchar(1000) NULL 
);

- 创建供应商表

CREATE TABLE Vendors
(
vend_id      char(10) NOT NULL ,
vend_name    char(50) NOT NULL ,
vend_address char(50) NULL ,
vend_city    char(50) NULL ,
vend_state   char(5)  NULL ,
vend_zip     char(10) NULL ,
vend_country char(50) NULL 
);

- 定义主键

ALTER TABLE Customers WITH NOCHECK ADD CONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (cust_id);
ALTER TABLE OrderItems WITH NOCHECK ADD CONSTRAINT PK_OrderItems PRIMARY KEY CLUSTERED     (order_num, order_item);
ALTER TABLE Orders WITH NOCHECK ADD CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED (order_num);
ALTER TABLE Products WITH NOCHECK ADD CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (prod_id);
ALTER TABLE Vendors WITH NOCHECK ADD CONSTRAINT PK_Vendors PRIMARY KEY CLUSTERED (vend_id);

- 定义外键

 ALTER TABLE OrderItems ADD
 CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num),
 CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);
 ALTER TABLE Orders ADD 
 CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
 ALTER TABLE Products ADD
 CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);

我有几个问题:

  1. Orders中的复合键的用途是什么?
  2. 由于order_num是主键和外键,我不能 了解如何在一个表格中Clustered 另一个Non-Clustered
  3. 另外,我在定义时并不理解WITH NOCHECK的目的 主键。
  4. 由于

1 个答案:

答案 0 :(得分:1)

  1. order_item是什么意思?从外观上看,您可以将其从PK中删除。

  2. FK基本上说"此处的值必须是其他表中的值之一"。想想一个下拉框:REFERENCES ... (...)子句中的列提供了可用选项列表。 CLUSTERED对此没有影响。您也可以创建FK引用非主键列。

  3. 创建主键时,SQL Server会检查表以确保PK列不包含重复值。 WITH NOCHECK禁用对现有数据的检查,但会检查进入表中的任何新数据。它的用法是not recommended