2012-01-24 158 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