Cho phép khóa ngoại là Null


7

Tôi đang cố gắng tạo mối quan hệ giữa hai bảng trong đó một cột trong BẢNG A là khóa ngoại cho một cột trong BẢNG B. Tuy nhiên, có một hàng trong BẢNG B hiện không có giá trị trong cột đó và nó gây ra lỗi cho tôi . Tuy nhiên, từ việc giải quyết vấn đề, sự đồng thuận chung dường như là null là một giá trị chấp nhận được trong trường khóa ngoại. Nhưng tôi vẫn không thể tạo mối quan hệ này trong SSMS do thông báo lỗi. Làm thế nào tôi có thể bỏ qua điều này?

Lỗi:

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'.

Mã SQL theo yêu cầu:

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

Cảm ơn


2
Thông báo lỗi chính xác bạn đang nhận được là gì? Bạn có chắc chắn đang tạo FK theo đúng hướng?
Martin Smith

Lệnh bạn đang sử dụng để tạo phím NGOẠI TỆ là gì. Khả năng không có của cột trong câu hỏi nên được quyết định bởi lệnh CREATE TABLE, chứ không phải lệnh CONSTRAINT.

3
Bạn có chắc chắn rằng thực tế là một cột là NULL và không có giá trị nào trong cột BẢNG A không khớp với bất kỳ cột nào trong BẢNG B? Điều đó sẽ báo cáo cùng một thông báo lỗi. Bạn có thể cung cấp kết xuất dữ liệu của hai bảng của bạn được chỉnh sửa vào bài đăng hoặc dưới dạng liên kết pastebin không?
mellamokb

5
Điều này nghe có vẻ ngớ ngẩn, nhưng bạn có chắc chắn rằng NULLbạn đang thấy thực sự là null và không phải là nội dung của nvarchar?

1
Đồng ý với @Nikola. Như bạn có thể thấy ở đây, NULLđược cho phép trong trường khóa ngoại: sqlfiddle.com/#!3/ab003 . Tuy nhiên, nếu bạn sử dụng chuỗi 'NULL'làm giá trị, tôi sẽ tạo ra thông báo lỗi tương tự mà bạn đang nhận: sqlfiddle.com/#!3/ab003 . Nếu bạn muốn tiến thêm một bước này, hãy cài đặt Gói công cụ SSMS và sử dụng trình hướng dẫn Tạo tập lệnh chèn để tạo SQL cho nội dung chính xác của các bảng và chỉnh sửa nó vào bài đăng của bạn. Bạn cũng có thể sử dụng tùy chọn "Tạo tập lệnh thay đổi" để bao gồm SQL cho fk_relationship được đề xuất của bạn.
mellamokb

Câu trả lời:


5

Đối với bất cứ ai vấp ngã ở đây với cùng một câu hỏi. Một ô trống không giống như một ô NULL. Các ô trống là '' không phải NULL!


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

Nếu bạn thay đổi giá trị "NULL" của mình thành không và nó hoạt động, có thể chỉ có một chuỗi trống hoặc một ký tự ẩn trong đó.

Hãy thử tạo lại FK của bạn sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.