0

同じテーブル内の2 つの列 (プログラム コードとテスト コード) の間に 1 対 1 の関係を確立したいと考えています。同じテスト コードを使用するすべてのテストに、同じプログラム コードを持たせたい。

  1. 最初に考えたのは、UDF を使用して、同じテスト コードが 2 つの異なるプログラムに対応するケースを見つけることでした。t-sqlは、UDP を使用するチェック制約に違反することを t-sql が許可するのはなぜですかINSERTS?UPDATES

  2. 次に考えたのは、ロジックを UDF からチェック制約自体に移動することでした。しかし、t-sql は、チェック制約ではサブクエリが許可されていないと言っています。これは、構文を使用できないことも意味しEXISTSます (サブクエリも使用すると思います)。

    ALTER TABLE [dbo].[mytable] WITH CHECK ADD CONSTRAINT [oneProgramPerTest] CHECK
    ( (select COUNT(*) from mydb.dbo.mytable u1 inner join mydb.dbo.mytable u2 on u1.testcode=u2.testcode and u1.progcode <> u2.progcode )=0 )

(1) udf または (2) サブクエリなしでこのロジックを強制する方法がない限り、プログラム コードの「ダミー」テーブルを作成し、テスト コード間に 1 対 1 の関係を強制する必要があるようです。 myTable とダミー テーブルから。これは本当に醜いように見えるので、もっと良い方法が必要です。右?

4

1 に答える 1

2

正規化について読んだことがありますか (読んでいないのであれば、なぜデータベースを設計しているのですか?)。次の構造を持つ必要があります

tableA
id (PK)
programcode
other fields

tableB
programcode (PK)
testcode

2 つのテーブル間に正式な外部キーを追加し、テーブル b でプログラム コードを PK として定義します。次に、必要なデータを取得するには:

select <Name specific fields, never use select *>
from tableA a
join tableB b on a.programcode = b.programcode
于 2013-03-27T20:16:49.567 に答える