2012-05-30 124 views
0

我在連接MSSQL Management studio的兩個表時遇到問題。 我的目標是通過外鍵連接表,如果我刪除用戶,我想第二個表條目將被自動刪除。我打算使用DELETE Cascade方法。SQL主鍵的外鍵問題

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->付款或付款 - >用戶?

當我試圖連接的用戶 - 使用foregn鍵通過電子郵件>付款 - >投資者,它告訴我,這樣的錯誤:

The columns in table 'Payments' do not match an existing primary key or UNIQUE constraint.

能否請你解釋一下我在哪裏的問題是什麼?我做錯了什麼?

+0

Users.ID和你在第二個表設置電子郵件喜歡外國的?在這裏添加聲明。 – Sajmon

+2

1)發佈你的DDL的表。 2)使用電子郵件地址作爲主鍵是一個非常糟糕的主意。 – Perception

+0

你標記了你的問題[sql]但是哪個? Oracle,MS SQL Server,MySQL ...等,併發布報告錯誤的查詢,這將有助於人們解決您的問題。 – Tony

回答

3

你的結構變更爲:

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); 

然後加入上Investments.UserID

+0

消息1776,級別16,狀態0,行1 引用表'用戶'中沒有與外鍵'FK__Investmen__UserI__15502E78'中的引用列表匹配的主鍵或候選鍵。 消息1750,級別16,狀態0,行1 無法創建約束。查看以前的錯誤。 –

+0

對不起。我做了一些編輯。我還沒有將原始(用戶)表上的PK更改爲[ID]。 – swasheck

+0

不幸地告訴它它是無效的語法:Msg 102,Level 15,State 1,Line 11 ','附近的語法不正確。 消息319,級別15,狀態1,行15 關鍵字'with'附近的語法不正確。如果此語句是公用表表達式,xmlnamespaces子句或變更跟蹤上下文子句,則前面的語句必須以分號結尾。 –

2

我搜索您所看到的錯誤消息(沒有表名)和普遍的共識 似乎是一個PRIMARY KEYUNIQUE contraint未正確在表設置。該錯誤還告訴我你(可能)使用SQL Server。

technet.microsoft.com

The columns on the primary key side of a foreign key relationship must participate in either a Primary Key or a Unique Constraint. After setting up a Primary Key or a Unique constraint for one of the tables you've selected, you can then define other relationships for that table.

檢查PRIMARY KEYS兩表所示。如果沒有桌面的實際DDL,很難獲得更多幫助。

編輯:Email在你UsersPRIMARY KEY,但我沒有看到在Investments表的Email場。你在哪些領域加入你的禁忌?

+0

謝謝你回答Tony,你能檢查我的編輯嗎? –

+0

如果您發佈表的DDL,這將有所幫助。在Management Studio中,右鍵單擊表格並選擇「Script As ...」,然後選擇「CREATE」。發佈它顯示的SQL腳本,以便我們可以檢查表格是否正確定義。 – Tony

+0

沒有問題,完成。 :) –