同じテーブルの別の列にある別の値に対して値をチェックするCHECK制約を実装する方法はありますか?具体的には、行を挿入する前に、挿入する「チェックアウト」日付値がテーブルの「チェックイン」日付値よりも大きいことを確認したいと思います。
詳細が不足している可能性がありますので、その場合はお知らせください。
同じテーブルの別の列にある別の値に対して値をチェックするCHECK制約を実装する方法はありますか?具体的には、行を挿入する前に、挿入する「チェックアウト」日付値がテーブルの「チェックイン」日付値よりも大きいことを確認したいと思います。
詳細が不足している可能性がありますので、その場合はお知らせください。
はい、MSSQL Server(およびその他)では、テーブルのチェック制約が許可されているため、列を比較できます。
ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin
CHECK (Ckeckout > Checkin)
次のようなチェックを使用できます。
ALTER TABLE dbo.myTable ADD CONSTRAINT CK_myTable_CheckoutGreaterThanCheckin
CHECK (dbo.CheckDates()>1)
次に、次のような関数を追加します。
CREATE FUNCTION CheckDates()
RETURNS int
AS
BEGIN
DECLARE @retval int
SET @retval = (SELECT COUNT(*) FROM myTable WHERE checkout > checkin)
RETURN @retval
END;
それらは書かれたとおりに機能しない可能性があります(申し訳ありませんが、現時点ではSQLエンジンにアクセスできません)。
または、チェックが失敗した場合にコードでエラー処理を使用する必要がないように、クエリにチェックを含めることもできます。
挿入を失敗させたいだけの場合は、where句を次のように拡張できます。
INSERT INTO myTable (checkout)
VALUES(@checkout)
WHERE @checkout > @checkin AND IDcolumn = @IDcolumn
問題が発生したことを示す何らかの種類のインジケーターを返したい場合は、上記のようなものを使用してSELECT @@ ROWCOUNTを追加するか、事前に値を確認するだけで使用できます。
DECLARE @var int
SET @var = (SELECT count(*)
FROM myTable
WHERE @checkout > checkin AND IDcolumn = @IDcolumn)
値が渡された場合、@varは1に等しくなります。
トリガーの使用を試みることができます。