2012-01-24 31 views
0

Webアプリケーションのデータベース互換性の範囲を拡大しようとしています。私たちのアプリケーションは、JSP、サーブレット、およびEJBを備えたJava EEです。アプリケーションを互換にしようとしているデータベースはSQL Server 2008です。Nullable外部キー制約

私たちの問題は、多くの場合、アプリケーションがヌル可能な外部キーを多くのファイルで使用していることです。これらのNULL可能な外部キーは他のデータベースでも機能しますが、特定の時刻に単一の外部キーが「NULL」になることが許可されるため、SQL Server 2008でそれらを使用できる方法が見つかりませんでした。一般に、このようなヌル可能な外部キーは避けることが最善であることを理解しています。しかし、このWebアプリケーションは大規模であり、ファイルを1つずつ変更することは非常に困難です。

これまでのところ、次のことを試しました。
[1]外部キーが何かを指すように、参照されたテーブルのダミー要素を初期化します。
[2]でダミーの要素を初期化し、残念ながら、外部キー制約

を除去するために、 'EXEC sp_msforeachtableある "ALTER TABLE?NOCHECK CONSTRAINTにすべてを"' を使用して、[1] Webアプリケーション内の多くのコンポーネントを壊した上で。

残念ながら、上記の[2]のステートメントに従って制約を削除しようとすると機能しませんでした。後で各テーブルをドロップしようとすると、外部キー制約エラーが発生するため、これが疑わしい。

現在、以下の質問に対する明確な回答は、私たちの進歩を助けるでしょう。
[1] SQL Server 2008で複数の 'ヌル'値の外部キーを使用できるようにする簡単な修正はありますか?
[2] Webアプリケーションの大幅な変更を伴わない、別の回避策がありますか?

+1

'CREATE TABLEをA(X INT NULL UNIQUE); INSERT INTO B値(NULL)、(NULL;表B(X INT NULLが(X)を参照)を作成) 'はうまくいきますので、おそらくテーブルAの複数のヌルの制限について話していますか? –

答えて

0

私はあなたが話しているかわからないんだけど!おそらく、サンプルスキーマを投稿した場合、私はあなたが意味するものを理解することができました。

あなたがテーブルで複数のヌル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 

挿入サンプルデータ:

テーブルとFKS構築

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

あなたが持つことができないのは、私が彼の問題かもしれないと信じている親テーブルの複数のヌルです。 – HLGEM