繁体   English   中英

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

[英]Understanding how a Primary Key of one Table can be a Foreign Key too

我得到下面的代码:


-创建客户表

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的目的。

谢谢

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

  2. FK基本上说“这里的值必须是该其他表中的值之一”。 考虑一个下拉框: REFERENCES ... (...)子句中的列提供了可用选项的列表。 CLUSTERED对它没有影响。 您也可以使FK引用非主键列。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM