私にtable A
は2つの列があります:
ID (int, PK)
MaxUsers (int)
私にtable B
は2つの列があります:
ItemID (int)
UserID (int)
table A
が一致するのレコード数はItemID
、値を超えることはできませんMaxUsers
。
これが物理的に発生しないように T-SQL テーブル制約を作成することは可能ですか?
乾杯!カート
私にtable A
は2つの列があります:
ID (int, PK)
MaxUsers (int)
私にtable B
は2つの列があります:
ItemID (int)
UserID (int)
table A
が一致するのレコード数はItemID
、値を超えることはできませんMaxUsers
。
これが物理的に発生しないように T-SQL テーブル制約を作成することは可能ですか?
乾杯!カート
条件が満たされない場合にクエリのロールバックを行う on-insert/update トリガーを作成できます。
これは、行レベルのCHECK
制約、UNIQUE
制約などの「バニラ」制約で行うことができFOREIGN KEYS
、移植性が高くなります。
CREATE TABLE TableA
(
ID INTEGER NOT NULL PRIMARY KEY,
MaxUsers INTEGER NOT NULL CHECK (MaxUsers > 0),
UNIQUE (ID, MaxUsers)
);
CREATE TABLE TableB
(
ID INTEGER NOT NULL,
MaxUsers INTEGER NOT NULL,
FOREIGN KEY (ID, MaxUsers)
REFERENCES TableA (ID, MaxUsers),
ID_occurrence INTEGER NOT NULL,
CHECK (ID_occurrence BETWEEN 1 AND MaxUsers),
UNIQUE (ID, ID_occurrence)
);
シーケンスを維持するにはID_occurrence
、「ヘルパー」ストアド プロシージャまたはトリガーを作成できます。