«Оператор INSERT конфликтовал с ограничением FOREIGN KEY», когда insert равен NULL

1

У меня есть эта проблема: у меня есть эта таблица, которая имеет 5 столбцов: ID, Usuario_IdUsuario, Artista_IdArtista, Disco_IdDisco, Lista_IdLista. Последние 4 являются внешними ключами, а последние 2 допускают null, потому что во время их создания таблицы, на которые они ссылаются, пусты. Поэтому я вставляю Usuario_IdUsuario и Artsita_IdArtista и я получаю следующее сообщение:

Оператор INSERT противоречил ограничению FOREIGN KEY "FK_Sigue_Lista". Конфликт произошел в базе данных "Tarea2", таблице "dbo.Lista", в столбце "IdLista". Заявление было прекращено.

Но эта таблица пуста и ничего не вставляет туда, поскольку она допускает null. Я уже проверил, он не имеет значения по умолчанию.

Примечание. Это можно рассматривать как "Дублировать", но ответы, приведенные в предыдущих вопросах, не работают для меня, и я не могу комментировать, чтобы спросить, что произойдет, если это не работает (значение по умолчанию).

Код вставки, где появляется проблема:

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, а также с помощью SQL Server 2012 с Management Studio)

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 не является допустимым внешним ключом - что не ясно в сообщении об ошибке?
  • 0
    @PrestonGuillot Где сообщение об ошибке говорит что-либо о null ?
Показать ещё 9 комментариев
Теги:
sql-server

2 ответа

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
    Я этого не заметил. Я исправил это, и теперь он не показывает никаких сообщений об ошибках, но в таблицу также ничего не вставляется.
  • 1
    @ JavierGonzález, возможно, вы не совершаете транзакцию.
Показать ещё 1 комментарий
0

Попробуйте явно установить два столбца в NULL следующим образом:

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

Согласно следующим ссылкам, это должно работать:
установить значение null в столбце внешнего ключа?
Может ли столбцы таблицы с внешним ключом иметь значение null?

Поскольку вы упомянули, что в столбце НЕ задано значение по умолчанию, вы также можете попытаться установить значение по умолчанию вместо NULL.

Вы можете увидеть в этом маленьком скрипте SQL, что вставка 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.

Сделайте это для других трех внешних ключей.

И последнее, но не менее важное: несколько ссылок на эту тему:
Как создать внешний ключ в SQL Server?
http://www.sqlinfo.net/sqlserver/sql_server_Create_foreign_key_contraints.php

  • 0
    Та же самая ошибка все еще происходит.
  • 0
    Не могли бы вы опубликовать свое заявление CREATE TABLE для Sigue в вашем вопросе? Может быть, попробуйте что-то вроде этого, чтобы создать его: stackoverflow.com/questions/21547/…
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню