sql ,一个表中有A,B两字段,如果A:1,B:2,如何约束不能让 B:1,A:2?

时间:2022-07-15 00:20:22
sql ,一个表中有A,B两字段,如果A:1,B:2,如何约束不能让 B:1,A:2?

16 个解决方案

#1


.......

#2


猜一个

CHECK (B>A)

#3


引用楼主 liuguocheng 的帖子:
sql ,一个表中有A,B两字段,如果A:1,B:2,如何约束不能让 B:1,A:2?

什么意思?

#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


引用 6 楼 liuguocheng 的回复:
写错了,就是A,B两字段,如果A:1,B:2,不能让A:2,B:1 


这样就能看明白了?
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也是了.

#9


引用 8 楼 liuguocheng 的回复:
意思是这样的,一个表是好友表 frined ,有userId,friendId. 
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系. 
所以我想建一个约束,如果userId=1,friendID=2,那么就不让 
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了. 

这样啊,你插入的时候加个触发器做下判断吧。



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


引用 8 楼 liuguocheng 的回复:
意思是这样的,一个表是好友表 frined ,有userId,friendId. 
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系. 
所以我想建一个约束,如果userId=1,friendID=2,那么就不让 
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了. 

建议不要这样的约束,有点画蛇添足。
理由如下:
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

#15


首先你要保证你现有的表是符合这个约束的,不然添加约束的时候它会报错的。

#16


谢谢14楼的兄弟.

#1


.......

#2


猜一个

CHECK (B>A)

#3


引用楼主 liuguocheng 的帖子:
sql ,一个表中有A,B两字段,如果A:1,B:2,如何约束不能让 B:1,A:2?

什么意思?

#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


引用 6 楼 liuguocheng 的回复:
写错了,就是A,B两字段,如果A:1,B:2,不能让A:2,B:1 


这样就能看明白了?
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也是了.

#9


引用 8 楼 liuguocheng 的回复:
意思是这样的,一个表是好友表 frined ,有userId,friendId. 
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系. 
所以我想建一个约束,如果userId=1,friendID=2,那么就不让 
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了. 

这样啊,你插入的时候加个触发器做下判断吧。



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


引用 8 楼 liuguocheng 的回复:
意思是这样的,一个表是好友表 frined ,有userId,friendId. 
现在是如果是 userId=1,friendId=2,就么 1和2就是好友关系. 
所以我想建一个约束,如果userId=1,friendID=2,那么就不让 
userId=2,friendId=1了,因为1和2是好友关系,2和1也是了. 

建议不要这样的约束,有点画蛇添足。
理由如下:
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

#15


首先你要保证你现有的表是符合这个约束的,不然添加约束的时候它会报错的。

#16


谢谢14楼的兄弟.