2012-03-07 38 views
1

カラムを外部キーにする必要があり、外部カラムの値に基づいて条件を満たす必要がある制約をSybaseで定義することは可能ですか、例えば以下の表の例では、「product.codeは有効な1のブランドコードの外部キーです」というように、「product」表に制約を作成できますか?外部キーを持つSybase制約と外部テーブルのカラム値の条件チェック

CREATE TABLE brand (
    code  char(8)  NOT NULL, 
    valid  int   NOT NULL, 
    rowid  numeric(10,0) IDENTITY, 
    CONSTRAINT brand_pk PRIMARY KEY (code), 
    CONSTRAINT valid_check CHECK (valid IN (0,1)) 
) 

CREATE TABLE product (
    code  char(8)  NOT NULL, 
    CONSTRAINT product_pk PRIMARY KEY (code) 
) 

答えて

3

私はそれが少しだけ構造を変更することが最善だと思う=有効。

CREATE TABLE brand (
    code  char(8)  NOT NULL, 
    valid  int   NOT NULL, 
    rowid  numeric(10,0) IDENTITY, 
    CONSTRAINT brand_pk PRIMARY KEY (code), 

    -- The following UNIQUE constraint lets the pair of values be the target of 
    -- a foreign key reference. 
    CONSTRAINT brand_is_valid UNIQUE (code, valid), 

    CONSTRAINT valid_check CHECK (valid IN (0,1)) 
); 

CREATE TABLE product (
    code  char(8)  NOT NULL, 
    valid  int   NOT NULL, 

    -- The column "code" is a PK in the referenced table, so this still works. It's 
    -- a 1:0 or 1:1 relationship. 
    CONSTRAINT product_pk PRIMARY KEY (code), 

    -- The next constraint requires a unique constraint on the pair of 
    -- columns in the table "brand". By itself, it references every row 
    -- in "brand". That's too many rows. 
    CONSTRAINT product_fk FOREIGN KEY (code, valid) 
          REFERENCES brand (code, valid), 

    -- But this constraint restricts the foreign key references to only those 
    -- rows that have valid = 1 in the table "brand". 
    CHECK (valid = 1) 
); 
1

「有効」の状態に基づいて外部キーの作成を回避するためには、あなたは、あなたのテーブルのデザインを変更し、product.code = NULLを設定するためのトリガーを作成する必要があります。 (私はしばらくの間Sybaseをコーディングしていませんが)これは一般的な考えです:

有効な場合はproduct.code = NULLを設定する必要があるため、新しい列を主キーとして追加します。 0:

CREATE TABLE product (
    rowid  int identity primary key, 
    code  char(8) NULL, 
    CONSTRAINT brand_fk FOREIGN KEY (code) REFERENCES brand(code) 
) 

は、この1に類似のトリガーを作成します。

create trigger FK_WhenValid 
on product 
for insert 
AS 
    IF (SELECT COUNT(*) FROM brand b inner join inserted i on b.code = i.code AND b.valid=0) > 0 
    BEGIN 
    UPDATE product SET code = NULL WHERE code in (SELECT i.code from brand b join inserted i on b.code = i.code and b.valid = 0) 
    END 

注:このトリガーは唯一の製品の挿入をサポートしてい。 「有効」が変更できる場合は、別の方法が必要です。

はまた、トリガーの代わりに、宣言型の制約のみ設定product.code = inserted.codeとして外部キーを実装することができたときに1

関連する問題