from
我在一个包含两列的表中有一个数据to
,例如:5-9
.
如果我插入一个新行1-6
,它不应该被接受,因为6
它位于 和5
之间9
。
1-3
- 应该接受(没有重叠),10-13
- 也应该接受。
我需要一个查询
from
我在一个包含两列的表中有一个数据to
,例如:5-9
.
如果我插入一个新行1-6
,它不应该被接受,因为6
它位于 和5
之间9
。
1-3
- 应该接受(没有重叠),10-13
- 也应该接受。
我需要一个查询
尝试这个
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
尝试这个:
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
根据 SQL 供应商的不同,实现会有所不同,但想法是相同的:您需要创建一个TRIGGER
onINSERT
或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();