2014-11-02 105 views
1

我有這樣的問題:我有這個表,有5列:ID, Usuario_IdUsuario, Artista_IdArtista, Disco_IdDisco, Lista_IdLista。最後4個是外鍵,最後2個允許空值,因爲在它們創建時,它們引用的表是空的。所以我插入Usuario_IdUsuarioArtsita_IdArtista,我得到以下信息:「INSERT語句衝突與外鍵約束」時插入爲NULL

INSERT語句衝突與外鍵約束「FK_Sigue_Lista」。衝突發生在數據庫「Tarea2」,表「dbo.Lista」,列'IdLista'。 該聲明已被終止。

但是該表是空的,並且沒有插入任何東西,因爲它允許空值。我已經檢查過,它沒有默認值。

注:這可能被視爲「重複」,但在以前的問題給出的答案不爲我工作,我不能發表評論我要問個究竟,如果不工作(默認值的東西)。

哪裏出現問題的插入代碼:

string insertQuery2 = "insert into Sigue (Usuario_IdUsuario, Artista_IdArtista) values (@usu, @Artista);"; //if I delete the ; inside the "", then it doesn't show any error messages, but it doesn't isert anything into the table either. 
SqlCommand sig = new SqlCommand(insertQuery2, conn); 

sig.Parameters.AddWithValue("@usu", idusu); //UserId taken from user table 
sig.Parameters.AddWithValue("@Artista", idar); //ArtistId taken from artist table. 

sig.ExecuteNonQuery(); 

我在做什麼錯?

(我用C#上的Visual Studio 2012的工作,並使用SQL Server 2012與管理工作室)

USE [Tarea2] 
GO 

/****** Object: Table [dbo].[Sigue] Script Date: 02-11-2014 20:32:44 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Sigue](
    [IdSigue] [int] IDENTITY(1,1) NOT NULL, 
    [Usuario_IdUsuario] [int] NOT NULL, 
    [Artista_IdArtista] [int] NOT NULL, 
    [Disco_IdDisco] [int] NULL, 
    [Lista_IdLista] [int] NULL, 
CONSTRAINT [PK_Sigue] PRIMARY KEY CLUSTERED 
(
    [IdSigue] 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 

ALTER TABLE [dbo].[Sigue] ADD CONSTRAINT [DF_Sigue_Disco_IdDisco] DEFAULT (NULL) FOR  [Disco_IdDisco] 
GO 

ALTER TABLE [dbo].[Sigue] ADD CONSTRAINT [DF_Sigue_Lista_IdLista] DEFAULT (NULL) FOR  [Lista_IdLista] 
GO 

ALTER TABLE [dbo].[Sigue] WITH CHECK ADD CONSTRAINT [FK_Sigue_Artista] FOREIGN  KEY([Artista_IdArtista]) 
REFERENCES [dbo].[Artista] ([IdArtista]) 
GO 

ALTER TABLE [dbo].[Sigue] CHECK CONSTRAINT [FK_Sigue_Artista] 
GO 

ALTER TABLE [dbo].[Sigue] WITH CHECK ADD CONSTRAINT [FK_Sigue_Disco] FOREIGN  KEY([Disco_IdDisco]) 
REFERENCES [dbo].[Disco] ([IdDisco]) 
GO 

ALTER TABLE [dbo].[Sigue] CHECK CONSTRAINT [FK_Sigue_Disco] 
GO 

ALTER TABLE [dbo].[Sigue] WITH CHECK ADD CONSTRAINT [FK_Sigue_Lista] FOREIGN  KEY([Lista_IdLista]) 
REFERENCES [dbo].[Lista] ([IdLista]) 
GO 

ALTER TABLE [dbo].[Sigue] CHECK CONSTRAINT [FK_Sigue_Lista] 
GO 

ALTER TABLE [dbo].[Sigue] WITH CHECK ADD CONSTRAINT [FK_Sigue_UserData] FOREIGN  KEY([Usuario_IdUsuario]) 
REFERENCES [dbo].[UserData] ([Id]) 
GO 

ALTER TABLE [dbo].[Sigue] CHECK CONSTRAINT [FK_Sigue_UserData] 
GO 
+4

'null'不是一個有效的外鍵 - 什麼是不清楚錯誤信息? – 2014-11-02 19:18:38

+0

@PrestonGuillot錯誤消息對'null'說了些什麼? – wolfgangwalther 2014-11-02 19:57:46

+0

標題說該值爲空。該錯誤消息指示該值違反了外鍵約束。 – 2014-11-02 21:32:37

回答

3
ALTER TABLE [dbo].[Sigue] 
WITH CHECK ADD CONSTRAINT [FK_Sigue_Lista] FOREIGN KEY([IdSigue]) 
REFERENCES [dbo].[Lista] ([IdLista]) 

應該

ALTER TABLE [dbo].[Sigue] 
WITH CHECK ADD CONSTRAINT [FK_Sigue_Lista] FOREIGN KEY(Lista_IdLista) 
REFERENCES [dbo].[Lista] ([IdLista]) 

您要驗證錯誤的列。目前的行爲是,它將驗證IdSigue中的值出現在[dbo].[Lista]中。這不是正確的語義。

同樣的錯誤也出現在你的大多數其他FK定義中。

+0

我沒注意到。我修正了它,現在它不顯示任何錯誤消息,但是沒有任何內容插入到表中。 – 2014-11-02 23:40:03

+1

@JavierGonzález可能它是在一個交易中,你不是那麼認真的。 – 2014-11-02 23:58:43

+0

我不知道發生了什麼,重新啓動我的電腦,現在我的代碼工作:D謝謝謝謝謝謝你:D – 2014-11-03 01:19:50

0

嘗試將兩列明確設定爲NULL這樣的:

INSERT INTO Sigue (Usuario_IdUsuario, Artista_IdArtista, Disco_IdDisco, Lista_IdLista) VALUES (@usu, @Artista, NULL, NULL); 

根據以下鏈接,這應該工作:
set null value in a foreign key column?
Can table columns with a foreign key be null?

既然你提到,該列沒有默認值設定,你也可以嘗試將默認值設置爲NULL代替。

你可以在這個小小的SQL Fiddle中看到,將NULL插入到外鍵中根本不是問題。

問題後,編輯:現在
,你提供你如何創建的外鍵的信息:你正在創建在同一列IdSigue所有四個外鍵。 FOREIGN KEY

ALTER TABLE [dbo].[Sigue] 
    WITH CHECK ADD CONSTRAINT [FK_Sigue_Artista] 
    FOREIGN KEY([Artista_IdArtista]) REFERENCES [dbo].[Artista] ([IdArtista]) 

所不同的是在()

的ALTER TABLE語句應改爲從:

ALTER TABLE [dbo].[Sigue] 
    WITH CHECK ADD CONSTRAINT [FK_Sigue_Artista] 
    FOREIGN KEY([IdSigue]) REFERENCES [dbo].[Artista] ([IdArtista]) 

來。

這樣做對其他三個外鍵定義爲好。

最後但並非最不重要一對夫婦對主題鏈接:
How do I create a foreign key in SQL Server?
http://www.sqlinfo.net/sqlserver/sql_server_Create_foreign_key_contraints.php

+0

仍然發生同樣的錯誤。 – 2014-11-02 20:15:30

+0

您能否在您的問題中發佈'Sigue'的CREATE TABLE語句? 也許嘗試這樣來創建它:http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement-for-a-given-表 – wolfgangwalther 2014-11-02 20:17:54

+0

Noob問題:如何在此處發佈代碼以保持代碼的格式? – 2014-11-02 21:28:49

相關問題