2012-01-24 154 views
0

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

我们遇到的问题是我们的应用程序在很多情况下在许多文件中使用可为空的外键。这些可空的外键可以在其他数据库中工作,但是我们还没有找到让他们在SQL Server 2008中工作的方法,因为它只允许在给定时间单个外键为'null'。我们知道,一般来说,最好避免使用可空的外键。但是,这个Web应用程序很大,逐个更改文件将非常困难。

到目前为止,我们尝试了以下方法:
[1]初始化引用表中的虚拟元素,以便外键指向某些内容。
[2]使用“EXEC sp_msforeachtable‘ALTER TABLE?NOCHECK约束所有的’”以删除外键约束

不幸的是,在初始化的哑元[1]突破了Web应用程序中的许多组件。

不幸的是,试图根据上述[2]中的语句去除约束条件并没有奏效。我们怀疑这是因为随后试图删除每个表导致外键约束错误。

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

+1

'CREATE TABLE A(X INT NULL UNIQUE); CREATE TABLE B(X INT空引用A(X)); INSERT INTO B值(NULL),(NULL )'工作正常,所以大概你在谈论限制表A中的多个空值? –

回答

0

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

你可以在一个表多个空FK列:

建表和FKS:

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 

OUTPUT:

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 
+0

你不可能在父表中有多个Null,我认为这可能是他的问题。 – HLGEM