Sql 如何在两个表之间共享相同的主键?
我正在读一本关于的书,遇到了这样一个问题: 所以我想知道如何创建这个数据库,以便我可以按照书中的示例进行操作Sql 如何在两个表之间共享相同的主键?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在读一本关于的书,遇到了这样一个问题: 所以我想知道如何创建这个数据库,以便我可以按照书中的示例进行操作 如何使用简单的TSQL命令创建这些表?忘记创建数据库吧,想象它已经存在。这只是我在SSMS中使用表设计器创建的一个示例,但应该会给您一个想法(请注意最后的外键约束): 请参见如何创建外键约束。这也有创建表的链接。您还需要创建数据库 回答你的问题: ALTER TABLE ProductWebInfo ADD CONSTRAINT fk_SKU FOREIGN KEY (SKU) REF
如何使用简单的TSQL命令创建这些表?忘记创建数据库吧,想象它已经存在。这只是我在SSMS中使用表设计器创建的一个示例,但应该会给您一个想法(请注意最后的外键约束):
请参见如何创建外键约束。这也有创建表的链接。您还需要创建数据库 回答你的问题:
ALTER TABLE ProductWebInfo
ADD CONSTRAINT fk_SKU
FOREIGN KEY (SKU)
REFERENCES Product(SKU)
当它说两个表共享相同的主键时,它只是意味着每个表中都有一个具有相同名称的字段,这两个字段都设置为主键
创建表
建立关系
如果表名只是单个单词(也不是关键字),则可能看起来更简单一些,例如,如果表名只是Product
和ProductWebInfo
,没有附加(第2章)
:
ALTER TABLE ProductWebInfo
ADD CONSTRAINT fk_SKU
FOREIGN KEY(SKU)
REFERENCES Product(SKU)
你已经得到了密码。我想分享一些信息,说明为什么您可能希望在这样的关系中有两个表 首先,当两个表具有相同的主键且具有外键关系时,这意味着它们具有一对一的关系。那么为什么不把它们放在同一张桌子上呢?您可能会将一些信息拆分到单独的表中,原因有很多 首先,信息在概念上是分开的。如果第二个表中包含的信息与一个单独的特定问题相关,则可以更轻松地使用它,因为数据位于单独的表中。例如,在您的示例中,他们已分离出图像,即使他们只打算每个SKU有一条记录。这样,如果您决定需要多个图像,就可以灵活地在以后轻松地将表更改为一对多关系。这还意味着,当您仅查询图像时,您不必实际访问另一个(可能更大)表 这让我们有了这样做的理由二。您当前有一个一对一关系,但您知道未来的版本已经计划将其转换为一对多关系。在这种情况下,更容易设计成一个单独的表,这样当您移动到该结构时就不会破坏所有代码。如果我打算这样做,我会继续创建一个代理键作为PK,并在FK上创建一个唯一索引。这样,当您转到一对多关系时,您所要做的就是删除唯一索引并用常规索引替换它 分开一对一关系的另一个原因是如果表变得太宽。有时,您只是有太多关于实体的信息,无法轻松地将其放入记录的最大大小。在这种情况下,您倾向于将使用最少的字段(或概念上适合的字段)移动到单独的表中 将它们分开的另一个原因是,尽管您有一个一一关系,但对于父表中的大多数记录,您可能不需要子表中的内容记录。因此,与其在父表中有很多空值,不如将其拆分
其他人显示的代码采用基于字符的PK。如果在自动生成Int或GUID时需要此类关系,则只需对父表执行自动生成。然后将该值存储在子表中,而不是在该表上生成新值 对于这个简单的例子来说,这似乎有点过于复杂了。介意把它简化成基本的东西吗?这是你能得到的最基本的东西。唯一真正缺少的是顶部的
createdatabase
语句。从逻辑上讲,我们所做的是创建父表(Product
)和子表(ProductWebInfo
)。然后,我们将创建一个从子级主键到父级主键的外键。使用(…)删除,[…]上的,dbo.
和GO
pieces@Michael同意。我正在讨论保留这些内容的价值,最初决定使用设计器的默认输出,这样,如果用户以后使用设计器,就不会让人感到困惑。不过,为了便于阅读,我把它们拿了出来。谢谢你的提示@Jeff:这本书没有显示TSQL,它假设这个数据库已经存在,因此问题就来了。你有没有尝试过书中的另一部分来解释如何创建数据库?您接受的答案没有任何创建数据库的代码。您的第一句话是误导性的。这与列名无关,一切都与你在后面的回答中正确指出的关系有关。你是对的,我的术语有点生疏。我的假设是错误的。谢谢你花时间写这篇文章,读得很好。:)
CREATE TABLE [Product (Chapter 2)](
SKU varchar(50) NOT NULL,
Description varchar(50) NULL,
Price numeric(18, 2) NULL,
CONSTRAINT [PK_Product (Chapter 2)] PRIMARY KEY CLUSTERED
(
SKU ASC
)
)
CREATE TABLE [ProductWebInfo (Chapter 2)](
SKU varchar(50) NOT NULL,
ImageURL varchar(50) NULL,
CONSTRAINT [PK_ProductWebInfo (Chapter 2)] PRIMARY KEY CLUSTERED
(
SKU ASC
)
)
ALTER TABLE [ProductWebInfo (Chapter 2)]
ADD CONSTRAINT fk_SKU
FOREIGN KEY(SKU)
REFERENCES [Product (Chapter 2)] (SKU)
ALTER TABLE ProductWebInfo
ADD CONSTRAINT fk_SKU
FOREIGN KEY(SKU)
REFERENCES Product(SKU)