Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server SQL Server密钥问题_Sql Server - Fatal编程技术网

Sql server SQL Server密钥问题

Sql server SQL Server密钥问题,sql-server,Sql Server,我是数据库设计新手,我有几个问题想问你们如何创建关系数据库 我有几个问题: 通过外键连接表A和表B,在表A或表B中在哪里创建键 假设我有一个1:1关系的表用户和排名 用户表格: CREATE TABLE [dbo].[Users]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Email] [nvarchar](89) NOT NULL, [Name] [nvarchar](25) NOT NULL, [Midname]

我是数据库设计新手,我有几个问题想问你们如何创建关系数据库

我有几个问题:

通过外键连接
表A
表B
,在
表A
表B
中在哪里创建键

假设我有一个1:1关系的表
用户
排名

用户
表格:

    CREATE TABLE [dbo].[Users](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Email] [nvarchar](89) NOT NULL,
    [Name] [nvarchar](25) NOT NULL,
    [Midname] [nvarchar](25) NOT NULL,
    [Surname] [nvarchar](25) NOT NULL,
    [Phone] [varchar](15) NOT NULL,
    [Country] [smallint] NOT NULL,
    [Manager] [nvarchar](89) NOT NULL,
    [Referrer] [nvarchar](89) NOT NULL,
    [Rank] [tinyint] NOT NULL,
       CONSTRAINT [PK_UsersID] PRIMARY KEY CLUSTERED 
       ([Email] ASC)
    )
    CREATE TABLE [dbo].[Ranks](
    [ID] [tinyint] IDENTITY(1,1) NOT NULL,
    [Rank] [nvarchar](50) NOT NULL,
      CONSTRAINT [PK_Rank] PRIMARY KEY CLUSTERED 
      ([ID] ASC)
    )
等级
表格:

    CREATE TABLE [dbo].[Users](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Email] [nvarchar](89) NOT NULL,
    [Name] [nvarchar](25) NOT NULL,
    [Midname] [nvarchar](25) NOT NULL,
    [Surname] [nvarchar](25) NOT NULL,
    [Phone] [varchar](15) NOT NULL,
    [Country] [smallint] NOT NULL,
    [Manager] [nvarchar](89) NOT NULL,
    [Referrer] [nvarchar](89) NOT NULL,
    [Rank] [tinyint] NOT NULL,
       CONSTRAINT [PK_UsersID] PRIMARY KEY CLUSTERED 
       ([Email] ASC)
    )
    CREATE TABLE [dbo].[Ranks](
    [ID] [tinyint] IDENTITY(1,1) NOT NULL,
    [Rank] [nvarchar](50) NOT NULL,
      CONSTRAINT [PK_Rank] PRIMARY KEY CLUSTERED 
      ([ID] ASC)
    )
我想通过以下方式加入他们:

Users.Rank ON Rank.ID
但它不允许我创建密钥,我遇到了这样的错误:

Microsoft SQL Server管理工作室

表“Users”中的列与现有主键或唯一约束不匹配

为什么它告诉我任何主键?我没有接触到主键,我正在使用外键,我不明白为什么PK和FK是相关的

你能解释一下我做错了什么吗


谢谢

Users.Rank ON Rank.ID这是正确的,但如果Users.Rank为int,则Rank.ID也应为int,否则将生成错误

个人的主键是例如个人ID、电子邮件、姓名+姓氏+年龄等,但在数据库中,此ID通常是整数类型。 如果有person表,则应该有列 人名、姓名、姓氏

当您在另一个表中使用personid时,它将成为外键。例如。 如果你有电话号码表,你会有这些列

numberid、前缀、number和personid-现在这个personid是FKFK类型=主键类型

您可以在数据库关系图中简单地执行此操作: 首先手动将主键字段拖动到外键表:

然后查看对话框并单击确定:)

Users.Rank ON Rank.ID这是正确的,但如果Users.Rank为int,则Rank.ID也应为int,否则将生成错误

个人的主键是例如个人ID、电子邮件、姓名+姓氏+年龄等,但在数据库中,此ID通常是整数类型。 如果有person表,则应该有列 人名、姓名、姓氏

当您在另一个表中使用personid时,它将成为外键。例如。 如果你有电话号码表,你会有这些列

numberid、前缀、number和personid-现在这个personid是FKFK类型=主键类型

您可以在数据库关系图中简单地执行此操作: 首先手动将主键字段拖动到外键表:

然后查看对话框并单击确定:)

我可以使用以下方法创建外键:

ALTER TABLE dbo.Users ADD CONSTRAINT
    FK_Users_Ranks FOREIGN KEY
    (
    Rank
    ) REFERENCES dbo.Ranks
    (
    ID
    )
像这样加入他们:

select
    *
    from Users           u 
        INNER JOIN Ranks r ON u.rank=r.id
我建议从Ranks.ID中删除
标识(1,1)
。由于值太少(tinyint),最好自己管理ID。您可以插入ID为10、20、30、40的列组。稍后如果需要,您可以添加15,如果您需要在10到20之间添加一个新的。有了身份,你就被锁定了


如果当前表中有数据并尝试添加FK,请确保在添加FK之前,所有用户.Rank值都存在于Rank.ID中。

我可以使用以下方法创建外键:

ALTER TABLE dbo.Users ADD CONSTRAINT
    FK_Users_Ranks FOREIGN KEY
    (
    Rank
    ) REFERENCES dbo.Ranks
    (
    ID
    )
像这样加入他们:

select
    *
    from Users           u 
        INNER JOIN Ranks r ON u.rank=r.id
我建议从Ranks.ID中删除
标识(1,1)
。由于值太少(tinyint),最好自己管理ID。您可以插入ID为10、20、30、40的列组。稍后如果需要,您可以添加15,如果您需要在10到20之间添加一个新的。有了身份,你就被锁定了


如果当前表中有数据并尝试添加FK,请确保在添加FK之前,所有用户.Rank值都存在于Rank.ID中。

是否在“正确方向”创建外键?根据错误消息,我冒昧地猜测您正在尝试创建关系,其中您:

  • 选择要作为用户的主键表,列要作为排名
  • 选择要排列的外键表,要标识的列
这意味着“key”Users.Rank将导出到Rank表,这是不可能的,因为Users.Rank列不是Users表的键

外键应位于另一个方向:

  • 主键表是秩,列ID
  • 外键表为Users,coulmn秩

这将创建一个一对多键,其中Users表中的meny行可以具有相同的排名。如果你真的想建立一对一的关系,你必须在Users.Rank列上创建一个唯一的索引(或约束)。

你是在“正确的方向”创建外键吗?根据错误消息,我冒昧地猜测您正在尝试创建关系,其中您:

  • 选择要作为用户的主键表,列要作为排名
  • 选择要排列的外键表,要标识的列
这意味着“key”Users.Rank将导出到Rank表,这是不可能的,因为Users.Rank列不是Users表的键

外键应位于另一个方向:

  • 主键表是秩,列ID
  • 外键表为Users,coulmn秩

这将创建一个一对多键,其中Users表中的meny行可以具有相同的排名。如果您确实希望建立一对一关系,则必须在Users.Rank列上创建唯一索引(或约束)。

出现此错误的原因是,您试图引用的用户表中的Rank列上没有唯一或主键it@marc_s,但我不能做用户。排名为PK。那么我该如何设计我的桌子呢?如果我不通过FK连接它们可以吗?KM的答案对你有用吗?从
Users.Rank
->
Rank.ID
创建FK?我误读/误解了你的问题我可以创建
User.Rank
->
Rank.ID
,但我不能
R