Zulassen, dass der Fremdschlüssel Null ist

7

Ich versuche, eine Beziehung zwischen zwei Tabellen zu erstellen, wobei eine Spalte in TABELLE A der Fremdschlüssel für eine Spalte in TABELLE B ist. Es gibt jedoch eine Zeile in TABELLE B, die derzeit in dieser Spalte null ist und mir einen Fehler gibt . Nach dem Googeln scheint der allgemeine Konsens jedoch zu sein, dass Null ein akzeptabler Wert in einem Fremdschlüsselfeld ist. Aufgrund der Fehlermeldung kann ich diese Beziehung in SSMS jedoch immer noch nicht erstellen. Wie kann ich das umgehen?

Error:

Unable to create relationship 'FK_RELATIONSHIP'. 
The ALTER TABLE statement conflicted with the FOREIGN KEY 
constraint "FK_RELATIONSHIP". The conflict occurred in database "DATABASE", 
table "TABLE A", column 'COLUMN 1'.

SQL-Code wie gewünscht:

USE [DATABASE]
GO
/****** Object:  Table [dbo].[TABLEA]    Script Date: 10/02/2012 17:44:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TABLEA](
[COLUMN1] [nvarchar](4) NOT NULL,
CONSTRAINT [PK_TABLEA] PRIMARY KEY CLUSTERED 
(
[COLUMN1] 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
/****** Object:  Table [dbo].[TABLEB]    Script Date: 10/02/2012 17:44:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TABLEB](
[COLUMN1] [nvarchar](15) NOT NULL,
[COLUMN2] [nvarchar](4) NULL,
 CONSTRAINT [PK_TABLEB] PRIMARY KEY CLUSTERED 
(
[COLUMN1] 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

Vielen Dank

Tony
quelle
2
Was ist die genaue Fehlermeldung, die Sie erhalten? Sind Sie sicher, dass Sie die FK in die richtige Richtung erstellen?
Martin Smith
Mit welchem ​​Befehl erstellen Sie den AUSLÄNDISCHEN SCHLÜSSEL. Die Nullfähigkeit der betreffenden Spalte sollte mit dem Befehl CREATE TABLE und nicht mit dem Befehl CONSTRAINT festgelegt werden.
3
Sind Sie sicher, dass eine Spalte NULL ist und nicht, dass die Spalte TABELLE A einen Wert enthält, der keiner Spalte in TABELLE B entspricht? Das würde auch die gleiche Fehlermeldung melden. Können Sie Daten-Dumps Ihrer beiden Tabellen bereitstellen, die im Beitrag oder als Pastebin-Link bearbeitet wurden?
Mellamokb
5
Das klingt albern, aber sind Sie sicher, dass NULLSie sehen , dass es tatsächlich null ist und nicht den Inhalt von nvarchar?
1
Stimmen Sie mit @Nikola überein. Wie Sie hier sehen können, NULList dies in einem Fremdschlüsselfeld zulässig: sqlfiddle.com/#!3/ab003 . Wenn Sie jedoch die Zeichenfolge 'NULL'als Wert verwenden, wird dieselbe Fehlermeldung generiert: sqlfiddle.com/#!3/ab003 . Wenn Sie noch einen Schritt weiter gehen möchten, installieren Sie das SSMS Tools Pack und generieren Sie mithilfe des Assistenten zum Generieren von Einfügeskripten SQL für den genauen Inhalt Ihrer Tabellen und bearbeiten Sie es in Ihrem Beitrag. Sie können auch die Option "Änderungsskript generieren" verwenden, um die SQL für Ihre vorgeschlagene fk_relationship einzuschließen.
Mellamokb

Antworten:

5

Für alle, die hier mit der gleichen Frage stolpern. Eine leere Zelle ist nicht dasselbe wie eine NULL-Zelle. Leere Zellen sind nicht NULL!

Tony
quelle
2
update TABLEA set COLUMN1 = NULL where COLUMN1 = '';
update TABLEB set COLUMN2 = NULL where COLUMN2= '';

Wenn Sie Ihre "NULL" -Werte in "Keine" ändern und dies funktioniert, ist möglicherweise nur eine leere Zeichenfolge oder ein verstecktes Zeichen darin enthalten.

Versuchen Sie danach, Ihre FK neu zu erstellen.

Nicolas de Fontenay
quelle