数据表如何实现这样的约束???

TrueYi 2008-01-31 07:04:40
现有表Product(ProductId,UnitId) 和表Unit (UnitId,UnitName)
表Product的外键UnitId为外键
现在实现在:
在插入Product表数据时能字段UnitId不约束,但删除Unit表中的记录时,如果有被Product表引用过的就约束
...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Free_Windy 2008-01-31
  • 打赏
  • 举报
回复
如果为楼主在三楼所讲的需求,即设置Insert 和 Update强制关系就可以了.可以插入NULL
liangCK 2008-01-31
  • 打赏
  • 举报
回复
使用
instead of 触发器.
TrueYi 2008-01-31
  • 打赏
  • 举报
回复
或者可以将我有问题理解为
如果在Product表中的UnitId字段允许插入空值,如果插入非空值就要受Unit表的主键约束.
liangCK 2008-01-31
  • 打赏
  • 举报
回复
使用触发器来代替你的约束看看.
liangCK 2008-01-31
  • 打赏
  • 举报
回复
级联引用完整性约束
当用户试图删除或更新外键所指向的键时,级联引用完整性约束使您得以定义 Microsoft® SQL Server™ 2000 所采取的操作。

CREATE TABLE 和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 和 ON UPDATE 子句:

[ ON DELETE { CASCADE | NO ACTION } ]


[ ON UPDATE { CASCADE | NO ACTION } ]
如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。NO ACTION 指定的行为与 SQL Server 的早期版本中发生的行为相同。

ON DELETE NO ACTION

指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚 DELETE。

ON UPDATE NO ACTION

指定如果试图更新某行中的键值,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚 UPDATE。

CASCADE 允许在表间级联键值的删除或更新操作,这些表的外键关系可追溯到执行修改的表。不能为任何具有 timestamp 列的外键和主键指定 CASCADE。

ON DELETE CASCADE

指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。

ON UPDATE CASCADE

指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。

级联引用操作的示例可以基于 Northwind 中 Products 表上的 FK_Products_Suppliers 约束。该约束建立了从 Products 表中的 SupplierID 列到 Suppliers 表中的 SupplierID 主键列的外键关系。如果为约束指定了 ON DELETE CASCADE,则删除 SupplierID = 1 的 Suppliers 表中的行时也将删除 SupplierID = 1 的 Products 表中的三行。如果为该约束指定了 ON UPDATE CASCADE,则更新 Suppliers 表中从 1 到 55 的 SupplierID 值也将更新 Products 表中 SupplierID 值当前等于 1 的三行的 SupplierID 值。

不能为具有 INSTEAD OF 触发器的表指定级联操作。为表定义级联操作后,就不能向该表添加 INSTEAD OF 触发器。

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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