【问题标题】:SQL Foreign key issue with Primary Keys主键的 SQL 外键问题
【发布时间】:2012-06-05 04:25:42
【问题描述】:

我在 MSSQL Management Studio 上连接两个表时遇到问题。 我的目标是通过外键连接表,如果我删除用户,我希望第二个表条目将被自动删除。我打算为此使用 DELETE Cascade 方法。

User:
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_Users] PRIMARY KEY CLUSTERED 
(
[Email] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

电子邮件是主键

Payments:
 CREATE TABLE [dbo].[Investments](
[ID] [bigint] NOT NULL,
[Investor] [nvarchar](89) NOT NULL,
[Sum] [decimal](19, 4) NOT NULL,
[Currency] [smallint] NOT NULL,
[Credit] [decimal](19, 4) NOT NULL,
[CreditRate] [decimal](19, 4) NOT NULL,
[Rate] [tinyint] IDENTITY(1,1) NOT NULL,
[Date] [smalldatetime] NOT NULL,
[Comment] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Investments] PRIMARY KEY CLUSTERED 
(
        [ID] ASC
 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

 GO

ID 是主键

我的 FK 应该是 USER->PAYMENTS 还是 PAYMENTS->USER?

当我尝试连接用户 -> 通过电子邮件使用外键付款 -> 投资者时,它告诉我这样的错误:

“Payments”表中的列与现有主键或 UNIQUE 约束不匹配。

你能解释一下问题出在哪里吗?而我做错了什么?

【问题讨论】:

标签: sql sql-server


【解决方案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);

ALTER TABLE [Users]
ADD CONSTRAINT PK_UsersID PRIMARY KEY (ID);

然后

CREATE TABLE [dbo].[Investments](
[ID] [bigint] NOT NULL,
[UserID] [bigint] NOT NULL,
[Sum] [decimal](19, 4) NOT NULL,
[Currency] [smallint] NOT NULL,
[Credit] [decimal](19, 4) NOT NULL,
[CreditRate] [decimal](19, 4) NOT NULL,
[Rate] [tinyint] IDENTITY(1,1) NOT NULL,
[Date] [smalldatetime] NOT NULL,
[Comment] [nvarchar](max) NOT NULL);

ALTER TABLE Investments
ADD CONSTRAINT PK_InstestmentsID PRIMARY KEY (ID);

ALTER TABLE Investments
ADD CONSTRAINT FK_UsersInvestments
FOREIGN KEY (UserID)
REFERENCES Users(ID);

然后加入Users.IDInvestments.UserID

【讨论】:

  • Msg 1776, Level 16, State 0, Line 1 引用表 'Users' 中没有与外键 'FK__Investmen__UserI__15502E78' 中的引用列列表匹配的主键或候选键。消息 1750,级别 16,状态 0,行 1 无法创建约束。查看以前的错误。
  • 对不起。我做了一些编辑。我还没有将原始 (Users) 表上的 PK 更改为 [ID]。
  • 不幸地告诉它什么是无效的语法:Msg 102, Level 15, State 1, Line 11 ',' 附近的语法不正确。消息 319,级别 15,状态 1,第 15 行关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
  • 当我不只是写自己的时候会发生这种情况:)。我已经用我在自己的 SSMS 中修改的 SQL 对其进行了更新,它可以正常工作
  • 每个表都应该有一个主键。这是唯一标识表中每条记录的方式。为了符合relational model 且不重复数据,您可以在另一个相关表中使用此键作为参考。正如@HLGEM 所指出的,电子邮件不是一个好的选择。在我的回答中,我使用了一个唯一键(身份ID 列)并将其用于与用户相关的投资。我实际上不记得你原来的帖子,但我认为你没有提到同样的事情。如果您必须使用电子邮件,请使用更具描述性的列
【解决方案2】:

我搜索了您看到的错误消息(没有表名)和普遍共识 似乎您的表格中没有正确设置PRIMARY KEY 或UNIQUE 约束。该错误还告诉我您(可能)正在使用 SQL Server。

来自technet.microsoft.com:

外键关系的主键端的列必须 参与主键或唯一约束。后 为其中一个表设置主键或唯一约束 您已选择,然后您可以为此定义其他关系 表。

在两个表中检查您的PRIMARY KEYS。如果没有表的实际 DDL,就很难提供更多帮助。

编辑:您在Users 表中有Email 作为PRIMARY KEY,但我在Investments 表中看不到Email 字段。您要加入哪些领域?

【讨论】:

  • 如果您发布表格的 DDL 会有所帮助。在 Management Studio 中,右键单击表并选择“Script As...”,然后选择“CREATE”。发布它显示的 SQL 脚本,以便我们检查表是否正确定义。
  • 我正在加入给投资者的电子邮件。
猜你喜欢
  • 2021-10-03
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多