たとえば、from
との 2 つの列を持つテーブルにデータがあります。to
5-9
新しい行を挿入すると、 との間にある1-6
ため、受け入れられません。6
5
9
1-3
- 受け入れる必要があります (オーバーラップなし)、10-13
- も受け入れる必要があります。
これには単一のクエリが必要です
たとえば、from
との 2 つの列を持つテーブルにデータがあります。to
5-9
新しい行を挿入すると、 との間にある1-6
ため、受け入れられません。6
5
9
1-3
- 受け入れる必要があります (オーバーラップなし)、10-13
- も受け入れる必要があります。
これには単一のクエリが必要です
SQLベンダーによって実装は異なりますが、考え方は同じです。onまたはを作成TRIGGER
する必要があります。INSERT
UPDATE
これはPostgreSQLのソリューションです。
CREATE TABLE mytable (
id SERIAL,
m1 INTEGER,
m2 INTEGER
);
CREATE OR REPLACE FUNCTION mytable_fn()
RETURNS trigger AS
$body$
DECLARE cnt INTEGER;
BEGIN
SELECT count(*) INTO cnt
FROM mytable
WHERE numrange(NEW.m1, NEW.m2)
&& numrange( m1, m2);
IF cnt > 0 THEN RAISE EXCEPTION 'Constraint violation';
ELSE RETURN NEW;
END IF;
END;
$body$
LANGUAGE 'plpgsql';
CREATE TRIGGER mytable_tr
BEFORE INSERT OR UPDATE
ON mytable FOR EACH ROW
EXECUTE PROCEDURE mytable_fn();
これを試して:
if not exist (select * from table where @from between [from] and [to])
begin
if not exist (select * from table where @to between [from] and [to])
begin
if not exist(select * from table where [from] between @from and @to)
begin
insert into table
select @from, @to
end
end
end
これを試して
DECLARE @from INT
DECLARE @to INT
SET @from = 14
SET @to = 16
IF NOT EXISTS (SELECT 1 FROM Table1 WHERE @from BETWEEN [from] AND [to]
OR @to BETWEEN [from] AND [to]
OR @from <= [from] AND @to >= [to])
BEGIN
INSERT INTO Table1([from], [to]) VALUES(@from, @to)
END
ELSE
BEGIN
--Already Exists
END