2

A と B の 2 つのテーブルがあります。構造は次のようになります。

CREATE TABLE A (
    w int NOT NULL,
    x int NOT NULL,
    y int NOT NULL,
    CONSTRAINT PK_A PRIMARY KEY (w, x, y)
)

CREATE TABLE B (
    w int NOT NULL,
    y int NULL,
    z int NOT NULL
)

テーブル B に入力された値のセットについて、w と y がテーブル A にあることを確認したい。テーブル B の y 値が null の場合、w がテーブル A にあることだけを確認したい。

いくつかのサンプル データ、挿入、および期待される結果:

Table A
w  x  y
----------
1  1  1
1  1  2
1  2  1
1  3  2
2  1  1

INSERT INTO B (w, y, z) VALUES (1, 1, 3) -- good
INSERT INTO B (w, y, z) VALUES (1, NULL, 3) -- good
INSERT INTO B (w, y, z) VALUES (1, 1, 4) -- good
INSERT INTO B (w, y, z) VALUES (2, NULL, 3) -- good
INSERT INTO B (w, y, z) VALUES (1, 3, 1) -- fail
INSERT INTO B (w, y, z) VALUES (3, NULL, 1) -- fail

これが機能する方法はありますか?それが機能する場合、私はSQL Server 2000を使用しています。

4

1 に答える 1

2

B.w残念ながら、で外部キー制約を使用することはできません。これは、B.yで一意でない列を参照するためAです。ただし、トリガーを介してこのチェックを追加できます。

create trigger check_w on B for insert, update
as
if not exists(select * from A join inserted on A.w = inserted.w) 
begin
  raiserror('W not in A!', 1, 1)
  rollback transaction
end

GO

create trigger check_y on B for insert, update
as
if 
(select y from inserted) is not null and 
not exists(select * from A join inserted on A.y = inserted.y) 
begin
  raiserror('Y not null and not in A!', 1, 1)
  rollback transaction
end

GO

これら2つのトリガーを1つに確実に組み合わせることができます。

deleteまた、操作にはAのトリガーが必要になることに注意してください。Bに一致する行がある場合は削除を防ぐか、カスケード削除操作を実行します。

于 2012-08-30T16:44:26.093 に答える