1

我有一张下表

create table tblcountry (
  unqid uniqueidentifier 
  name varchar(100)
  isremoved bit
)

我想根据 unqid + isremoved 创建主键,其中 isremoved 必须为真

我还有另一张桌子:

create table tblstate (
  unqid uniqueidentifier,
  name varchar(100)
  f_tblcountry uniqueidentifier,
  isremoved bit
)

主要的是,我希望当我尝试将 isremoved 字段设置为 true 或 tabcountry 1 时,如果我在引用的表 tabstate 中使用了它并且它使用它的 isremoved 字段的记录不正确,它应该给我错误。并且如果该主键的 tabstate isremoved 为真,则它不应该给出任何错误。

4

3 回答 3

1

我执行了您的解决方案,运行良好。当我在 tabcountry 中插入数据时,它让我插入,但是当我尝试插入 tabstate 时,它​​给了我错误

select * from tblcountry 
5CF96D52-994B-45E3-9CF9-1BC948280E57    india   0
AC2AB153-7FBA-48BC-911B-74A178C74FB5    pak 0
763D2186-68BF-4334-AAA1-CCE16E14E6B1    us  0

当我插入 tabstate 如下查询时

insert INto tblstate values (NEWID(),'raj','5CF96D52-994B-45E3-9CF9-1BC948280E57',0)

我收到以下错误:

消息 547,级别 16,状态 0,第 1 行 INSERT 语句与 FOREIGN KEY 约束“fk”冲突。冲突发生在数据库“usecomp”、表“dbo.tblcountry”中。该语句已终止。

于 2009-12-05T05:34:41.020 回答
1

我想根据 unqid + isremoved 创建主键,其中 isremoved 必须为真

关于值,主键仅确保它们是唯一的。当主键是一个组合——由多个列组成——这意味着该键是所有相关列的任何唯一组合。这意味着如果主键同时是unqidisremoved- 以下将是表中的有效行:

UNQID                                  |   ISREMOVED
---------------------------------------------------------------
6F9619FF-8B86-D011-B42D-00C04FC964FF   |   1
6F9619FF-8B86-D011-B42D-00C04FC964FF   |   0

您的主键不应包含isremoved列。

...当我尝试将 tblcountry 表中的isremoved字段值设置为 true/1 时,如果我在引用的表 tblstate 中使用它,如果它的isremoved字段不为真,我应该会收到错误消息。并且如果该主键的 tabstate isremoved 为真,则它不应该给出任何错误。

为此,您需要一个外键引用,将中的unqid和列与表中的和isremoved列相关联。tblcountryunqidisremovedtblstate

ALTER TABLE tblcountry 
  ADD CONSTRAINT tstate_fk FOREIGN KEY (unqid, isremoved) references tblstate (unqid, isremoved)

约书亚的想法是正确的,方向是错误的。
但这意味着要向 中插入记录tblcountry,您必须在 中已有unqidtblstate。具有外键约束的列可以为空 - 值为空不会触发外键约束 - 但您不能指定外键的一部分。要么满足外键,要么不满足。

我不清楚您希望建模什么 - 如果我有更好的想法,我会提供替代方案。

于 2009-12-05T05:42:17.273 回答
0
create table tblcountry (
  unqid uniqueidentifier,
  name varchar(100),
  isremoved bit,
  PRImARY KEY (unqid, isremoved)
)


create table tblstate (
    unqid uniqueidentifier,
    name varchar(100),
    f_tblcountry uniqueidentifier,
    isremoved bit,
  )

  CREATE INDEX tblstateref ON tblstate (unqid, isremoved) -- always use index w/ foreign keys

  ALTER TABLE tblstate ADD CONSTRAINT fk FOREIGN KEY (unqid, isremoved) references tblcountry (unqid, isremoved)
于 2009-12-05T05:24:38.147 回答