-1

たとえば、fromとの 2 つの列を持つテーブルにデータがあります。to5-9

新しい行を挿入すると、 との間にある1-6ため、受け入れられません。659

1-3- 受け入れる必要があります (オーバーラップなし)、10-13- も受け入れる必要があります。

これには単一のクエリが必要です

4

3 に答える 3

0

SQLベンダーによって実装は異なりますが、考え方は同じです。onまたはを作成TRIGGERする必要があります。INSERTUPDATE

これは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();
于 2013-03-19T05:24:36.600 に答える
0

これを試して:


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

于 2013-03-19T05:18:41.040 に答える
0

これを試して

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
于 2013-03-19T05:51:30.770 に答える