Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在两个表之间共享相同的主键?_Sql_Sql Server_Tsql - Fatal编程技术网

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)