可空的外键约束

时间:2012-01-24 21:47:11

标签: java sql-server sql-server-2008 java-ee foreign-keys

我们正在尝试增加Web应用程序的数据库兼容性范围。我们的应用程序是带有JSP,Servlet和EJB的Java EE。我们试图使我们的应用程序兼容的数据库是SQL Server 2008。

我们遇到的问题是我们的应用程序在很多文件中使用可以为空的外键。这些可以为空的外键在其他数据库中工作,但我们还没有找到一种方法让它们在SQL Server 2008中工作,因为它只允许在给定时间单个外键为“null”。我们理解,一般来说,最好避免使用这种可以为空的外键。但是,这个Web应用程序很大,并且很难一个一个地更改文件。

到目前为止,我们尝试了以下内容:
[1]初始化引用表中的虚拟元素,以便外键指向某个东西 [2]使用'EXEC sp_msforeachtable“ALTER TABLE?NOCHECK CONSTRAINT all”'以删除外键约束

不幸的是,上面[1]中初始化虚拟元素打破了Web应用程序中的许多组件。

不幸的是,根据上面[2]中的陈述尝试删除约束不起作用。我们怀疑这是因为后续尝试删除每个表会导致外键约束错误。

目前,对以下问题的明确答案将有助于我们取得一些进展:
[1]是否有快速修复允许SQL Server 2008允许多个“空值”外键? [2]我们可以尝试另一种解决方法,不会对我们的Web应用程序进行大量更改吗?

1 个答案:

答案 0 :(得分:0)

我不确定你在说什么!可能如果您发布了示例模式,我就能理解您的意思。

您可以在表中添加多个空FK列

构建表格和FK:

CREATE TABLE dbo.AAAA
    (
    A_ID int NOT NULL identity(1,1) primary key,
    B_ID int NULL,
    C_ID int NULL
    )  ON [PRIMARY]

CREATE TABLE dbo.BBBB
    (
    B_ID int NOT NULL identity(1,1) primary key,
    A_ID int NULL,
    C_ID int NULL
    )  ON [PRIMARY]

CREATE TABLE dbo.CCCC
    (
    C_ID int NOT NULL identity(1,1) primary key,
    A_ID int NULL,
    B_ID int NULL
    )  ON [PRIMARY]


ALTER TABLE dbo.CCCC ADD CONSTRAINT FK_CCCC_AAAA FOREIGN KEY ( A_ID ) REFERENCES dbo.AAAA ( A_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 
ALTER TABLE dbo.BBBB ADD CONSTRAINT FK_BBBB_AAAA FOREIGN KEY ( A_ID ) REFERENCES dbo.AAAA ( A_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 
ALTER TABLE dbo.CCCC ADD CONSTRAINT FK_CCCC_BBBB FOREIGN KEY ( B_ID ) REFERENCES dbo.BBBB ( B_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 
ALTER TABLE dbo.AAAA ADD CONSTRAINT FK_AAAA_BBBB FOREIGN KEY ( B_ID ) REFERENCES dbo.BBBB ( B_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 
ALTER TABLE dbo.AAAA ADD CONSTRAINT FK_AAAA_CCCC FOREIGN KEY ( C_ID ) REFERENCES dbo.CCCC ( C_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 
ALTER TABLE dbo.BBBB ADD CONSTRAINT FK_BBBB_CCCC FOREIGN KEY ( C_ID ) REFERENCES dbo.CCCC ( C_ID ) ON UPDATE  NO ACTION  ON DELETE  NO ACTION 

插入样本数据:

INSERT INTO AAAA VALUES (NULL,NULL)
INSERT INTO AAAA VALUES (NULL,NULL)
INSERT INTO AAAA VALUES (NULL,NULL)

INSERT INTO BBBB VALUES (1,NULL)
INSERT INTO BBBB VALUES (2,NULL)
INSERT INTO BBBB VALUES (NULL,NULL)
INSERT INTO BBBB VALUES (NULL,NULL)
INSERT INTO BBBB VALUES (1,NULL)

显示数据(查看有多少FK列为空):

select * from AAAA
select * from BBBB
select * from CCCC

输出:

A_ID        B_ID        C_ID
----------- ----------- -----------
1           NULL        NULL
2           NULL        NULL
3           NULL        NULL

(3 row(s) affected)

B_ID        A_ID        C_ID
----------- ----------- -----------
1           1           NULL
2           2           NULL
3           NULL        NULL
4           NULL        NULL
5           1           NULL

(5 row(s) affected)

C_ID        A_ID        B_ID
----------- ----------- -----------

(0 row(s) affected)

如果这不是您所说的,您需要提供一些示例表和数据。

删除这些测试表:

ALTER TABLE dbo.CCCC drop CONSTRAINT FK_CCCC_AAAA
ALTER TABLE dbo.BBBB drop CONSTRAINT FK_BBBB_AAAA
ALTER TABLE dbo.CCCC drop CONSTRAINT FK_CCCC_BBBB
ALTER TABLE dbo.AAAA drop CONSTRAINT FK_AAAA_BBBB
ALTER TABLE dbo.AAAA drop CONSTRAINT FK_AAAA_CCCC
ALTER TABLE dbo.BBBB drop CONSTRAINT FK_BBBB_CCCC
drop table AAAA
drop table BBBB
drop table CCCC