16 个解决方案
#1
.......
#2
猜一个
CHECK (B>A)
CHECK (B>A)
#3
什么意思?
#4
偶也没有看明白@!!说详细点吧
#5
--drop table tb
create table tb(A int,B int,check(A<>2 or B<>1))
insert tb values(2,1)
/*
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CK__tb__569ECEE8"冲突。该冲突发生于数据库"testdb",表"dbo.tb"。
语句已终止。
*/
#6
写错了,就是A,B两字段,如果A:1,B:2,不能让A:2,B:1
#7
这样就能看明白了?
A=1 B=2?
#8
意思是这样的,一个表是好友表 frined ,有userId,friendId.
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系.
所以我想建一个约束,如果userId=1,friendID=2,那么就不让
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了.
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系.
所以我想建一个约束,如果userId=1,friendID=2,那么就不让
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了.
#9
这样啊,你插入的时候加个触发器做下判断吧。
表
create table Friends
(
userid varchar(10),
friendid varchar(10)
)
触发器
Alter TRIGGER [Friends_Insert] ON [Friends]
Instead of INSERT
AS
BEGIN
SET NOCOUNT ON;
if not exists(select top 1 0 from Friends a,inserted b where (a.userid=b.userid and a.friendid=b.friendid) or (a.userid=b.friendid and a.friendid=b.userid))
Begin
insert into Friends
select * from inserted
End
END
GO
--------------测试数据
insert into Friends
select '1','2'
insert into Friends
select '2','1'
select * from Friends
userid friendid
1 2
最后'2'和'1'没插进去。
#10
建议不要这样的约束,有点画蛇添足。
理由如下:
1.增加好友查询统计的开销。
2.不利于扩展。比如A加B好友,但B未必想加A好友。
#11
能者见能,智者见智
#12
我们就要做这样的,会写这样的约束吗?
#13
create trigger t1
on tb
for insert,update
begin
as
begin
if exists(select 1 from tb,inserted where tb.col2=inserted.col1 and tb.col1=inserted.col2)
rollback
end
#14
--创建一个检测的函数
CREATE FUNCTION CheckFnctn()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval=COUNT(*) FROM
(SELECT A,B FROM
(SELECT A,B FROM TABLE1 UNION ALL SELECT B,A FROM TABLE1) A
GROUP BY A,B
HAVING COUNT(*)>1) A
RETURN @retval
END
GO
--给表添加一个约束
ALTER TABLE TABLE1
ADD CONSTRAINT [chk_AandB] CHECK (dbo.CheckFnctn()=0)
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval=COUNT(*) FROM
(SELECT A,B FROM
(SELECT A,B FROM TABLE1 UNION ALL SELECT B,A FROM TABLE1) A
GROUP BY A,B
HAVING COUNT(*)>1) A
RETURN @retval
END
GO
--给表添加一个约束
ALTER TABLE TABLE1
ADD CONSTRAINT [chk_AandB] CHECK (dbo.CheckFnctn()=0)
GO
#15
首先你要保证你现有的表是符合这个约束的,不然添加约束的时候它会报错的。
#16
谢谢14楼的兄弟.
#1
.......
#2
猜一个
CHECK (B>A)
CHECK (B>A)
#3
什么意思?
#4
偶也没有看明白@!!说详细点吧
#5
--drop table tb
create table tb(A int,B int,check(A<>2 or B<>1))
insert tb values(2,1)
/*
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CK__tb__569ECEE8"冲突。该冲突发生于数据库"testdb",表"dbo.tb"。
语句已终止。
*/
#6
写错了,就是A,B两字段,如果A:1,B:2,不能让A:2,B:1
#7
这样就能看明白了?
A=1 B=2?
#8
意思是这样的,一个表是好友表 frined ,有userId,friendId.
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系.
所以我想建一个约束,如果userId=1,friendID=2,那么就不让
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了.
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系.
所以我想建一个约束,如果userId=1,friendID=2,那么就不让
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了.
#9
这样啊,你插入的时候加个触发器做下判断吧。
表
create table Friends
(
userid varchar(10),
friendid varchar(10)
)
触发器
Alter TRIGGER [Friends_Insert] ON [Friends]
Instead of INSERT
AS
BEGIN
SET NOCOUNT ON;
if not exists(select top 1 0 from Friends a,inserted b where (a.userid=b.userid and a.friendid=b.friendid) or (a.userid=b.friendid and a.friendid=b.userid))
Begin
insert into Friends
select * from inserted
End
END
GO
--------------测试数据
insert into Friends
select '1','2'
insert into Friends
select '2','1'
select * from Friends
userid friendid
1 2
最后'2'和'1'没插进去。
#10
建议不要这样的约束,有点画蛇添足。
理由如下:
1.增加好友查询统计的开销。
2.不利于扩展。比如A加B好友,但B未必想加A好友。
#11
能者见能,智者见智
#12
我们就要做这样的,会写这样的约束吗?
#13
create trigger t1
on tb
for insert,update
begin
as
begin
if exists(select 1 from tb,inserted where tb.col2=inserted.col1 and tb.col1=inserted.col2)
rollback
end
#14
--创建一个检测的函数
CREATE FUNCTION CheckFnctn()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval=COUNT(*) FROM
(SELECT A,B FROM
(SELECT A,B FROM TABLE1 UNION ALL SELECT B,A FROM TABLE1) A
GROUP BY A,B
HAVING COUNT(*)>1) A
RETURN @retval
END
GO
--给表添加一个约束
ALTER TABLE TABLE1
ADD CONSTRAINT [chk_AandB] CHECK (dbo.CheckFnctn()=0)
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval=COUNT(*) FROM
(SELECT A,B FROM
(SELECT A,B FROM TABLE1 UNION ALL SELECT B,A FROM TABLE1) A
GROUP BY A,B
HAVING COUNT(*)>1) A
RETURN @retval
END
GO
--给表添加一个约束
ALTER TABLE TABLE1
ADD CONSTRAINT [chk_AandB] CHECK (dbo.CheckFnctn()=0)
GO
#15
首先你要保证你现有的表是符合这个约束的,不然添加约束的时候它会报错的。
#16
谢谢14楼的兄弟.