【问题标题】:Primary and Foreign Key at the same time主键和外键同时进行
【发布时间】:2012-02-09 04:51:15
【问题描述】:

是否可以在 SQL Server 2008 中创建一个包含 2 列同时是主键和外键的表?如果是,那么这样的代码会是什么样子?我已经搜索过,但一无所获。

【问题讨论】:

  • 你的意思是创建表的 SQL 是什么样的?
  • 这在 ORM 框架上是一个非常常见的情况,它通过执行每个类的表映射来支持继承映射。例如,如果类 B 继承自类 A,并且它们映射到 table_a 和 table_b,则 B 的实例通常在 table_a 和 table_b 上具有相同的 id,并且 table_b 在它的 id 列上定义了一个 FK 到 table_a标识列。只需尝试使用 SQLServer Management Studio 定义 FK 和 PK。

标签: sql-server foreign-keys primary-key


【解决方案1】:

这些是完全不同的结构。

主键用于在表中强制执行唯一性,并且是某个记录的唯一标识符。

外键用于参照完整性,以确保值存在于另一个表中。

外键需要引用另一个表中的主键。

如果您想拥有一个也是唯一的外键,您可以创建一个 FK 约束并向同一字段添加唯一索引/约束。

出于参考目的,SQL Server 允许 FK 引用 UNIQUE CONSTRAINT 以及 PRIMARY KEY 字段。

【讨论】:

    【解决方案2】:

    当然,没问题:

    CREATE TABLE dbo.[User]
    (
      Id int NOT NULL IDENTITY PRIMARY KEY,
      Name nvarchar(1024) NOT NULL
    );
    
    CREATE TABLE [Group] 
    (
      Id int NOT NULL IDENTITY PRIMARY KEY,
      Name nvarchar(1024) NOT NULL
    );
    
    CREATE TABLE [UserToGroup]
    (
      UserId int NOT NULL,
      GroupId int NOT NULL,
      PRIMARY KEY CLUSTERED ( UserId, GroupId ),
      FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
      FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
    );
    

    这通常用于建模多对多关系。

    【讨论】:

    • 仅供参考,在UserToGroup 表的information_schema.key_column_usage 中,UserIDGroupID 将分别返回两行... 1 行用于PK,1 行用于FK.. .in reference to...
    【解决方案3】:

    只是一个简短的说明 - 来自 Microsoft 页面 (http://msdn.microsoft.com/en-us/library/ms189049.aspx)...

    “外键约束不必只链接到另一个表中的主键约束;它也可以定义为引用另一个表中唯一约束的列。”

    不经常使用,但在某些情况下很有用。

    【讨论】:

      【解决方案4】:

      这可能不是一个好主意,因为您经常希望在表中允许重复的外键。即使你现在不这样做,将来你也可能这样做,所以最好不要这样做。见Is it fine to have foreign key as primary key?

      【讨论】:

      • 为什么不呢?就像您放置的链接一样,它表示在某些情况下可能需要一对一的关系
      • 我并没有说这总是一个坏主意 ;) 你是对的,可能会有例外情况,它总是 1:1。我的评论是为了让人们思考对他们来说正确的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多