如何建立这样的表级约束?

itmouse 2004-10-29 02:48:45
在一个现有的SQL SERVER数据库上做二次开发,库中有一个用户表,主键是USERID numeric(18,0),二次开发时新建一个表,表中有一个字段是USERID,要将其关联到前面用户表中的USERID字段,但新建表中的USERID字段要使用数据类型int,所以计划在新建表中建立表级约束(就是增加 CHECK 子句),使新建表中的USERID的取值范围局限于用户表的主键上,如何写这个CHECK?我使用USERID IN (SELECT USERID FROM [USERS])是不行的) (建立表间关系也是不行的,因为二者之间数据类型不同)
...全文
236 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
playyuer 2004-10-29
  • 打赏
  • 举报
回复
USERID IN (SELECT cast(USERID as int) FROM [USERS])
zjcxc 元老 2004-10-29
  • 打赏
  • 举报
回复
--4.你要用check约束的话,可以写个自定义函数来实现
create function f_chk(@userid int)
returns bit
as
begin
return(case when exists(select * from 用户表 where userid=@userid ) then 1 else 0 end)
end
go

--然后在你的新表中,使用
create table 新表(user id int check(dbo.f_chk(userid)=1))
zjcxc 元老 2004-10-29
  • 打赏
  • 举报
回复
--2.因为你的两个表的字段类型不同,所以即使原来的用户表userid是主键,也不能用约束

--3.你可以在程序中做判断处理.
aliren 2004-10-29
  • 打赏
  • 举报
回复
zjcxc 元老 2004-10-29
  • 打赏
  • 举报
回复
--1.用触发器
create trigger tr_chk on 新表
for insert,update
as
if exists(select * from inserted i where not exists(select * from 用户表 where userid=i.userid))
begin
raiserror('用户id超出允许的范围,操作被取消',1,16)
rollback tran
end
shuiniu 2004-10-29
  • 打赏
  • 举报
回复
约束可以是列约束或表约束:
列约束被指定为列定义的一部分,并且仅适用于那个列(前面的示例中的约束就是列约束)。
表约束的声明与列的定义无关,可以适用于表中一个以上的列。

当一个约束中必须包含一个以上的列时,必须使用表约束。

例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约束将这两列加入主键内。假设有一个表记录工厂内的一台计算机上所发生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件属于同一类型。这一点可以通过将 type 列和 time 列加入双列主键内来强制执行。

CREATE TABLE factory_process
(event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )

itmouse 2004-10-29
  • 打赏
  • 举报
回复
一楼的大哥,你好快呀!
我对触发器有些个人看法,所以不想使用触发器实现这个功能。
而且,据我所知,这个是可以使用CHECK实现的。
pbsql 2004-10-29
  • 打赏
  • 举报
回复
用insert/update触发器来约束

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧