我有这个问题:我的这个表有5列:ID, Usuario_IdUsuario, Artista_IdArtista, Disco_IdDisco, Lista_IdLista
。最后4个是外键,最后2个是空值,因为在创建它们时,它们引用的表是空的。我插入了Usuario_IdUsuario
和Artsita_IdArtista
,然后收到以下消息:
INSERT语句与FOREIGN KEY约束冲突" FK_Sigue_Lista"。冲突发生在数据库" Tarea2",table" dbo.Lista",column' 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();
我做错了什么?
(我在Visual Studio 2012上使用C#,并在Management Studio中使用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
答案 0 :(得分: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定义也会出现相同的错误。
答案 1 :(得分: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
上创建所有四个外键。
ALTER TABLE语句应该改为:
ALTER TABLE [dbo].[Sigue]
WITH CHECK ADD CONSTRAINT [FK_Sigue_Artista]
FOREIGN KEY([IdSigue]) REFERENCES [dbo].[Artista] ([IdArtista])
为:
ALTER TABLE [dbo].[Sigue]
WITH CHECK ADD CONSTRAINT [FK_Sigue_Artista]
FOREIGN KEY([Artista_IdArtista]) REFERENCES [dbo].[Artista] ([IdArtista])
区别在于()
之后的FOREIGN KEY
。
也可以为其他三个外键定义执行此操作。
关于这个主题的最后但并非最不重要的几个链接:
How do I create a foreign key in SQL Server?
http://www.sqlinfo.net/sqlserver/sql_server_Create_foreign_key_contraints.php