标签: referential-integrity

具有可为空列的复合外键

在下表中,是否有办法确保 PreviousID 始终引用具有匹配 ParentID 的行中的 ID,或者,如果 ParentID 为空,则它在引用的行中也为空?

CREATE TABLE MyTable (
  ID int not null identity(1,1) primary key,
  ParentID int null foreign key references MyTable (ID),
  PreviousID int null foreign key reference MyTable (ID),
    foreign key (ParentID, PreviousID) references MyTable (ParentID, ID)
)
Run Code Online (Sandbox Code Playgroud)

一个例子:

+-ID-+-ParentID-+-PreviousID-+  
| 1 | 空 | 空 |  
| 2 | 1 | 空 |  
| 3 | 空 | 2 | <-- 应该不可能,应该引用 ParentID 为 null 的 ID
+----+------------+------------+  

有没有办法强制执行?

更新:对于那些想知道的人,由于以下原因(从MSDN复制),复合外键不会强制执行此操作: …

sql-server referential-integrity foreign-keys

7
推荐指数
1
解决办法
3930
查看次数

在MySQL中,FKs的"CONSTRAINT"是做什么的?

我看过MySQL 5.1文档,但仍然无法弄清楚这一点 - 我注意到我输入MySQL的代码与系统输出代码之间存在差异.

代码示例01和02之间有什么区别,这意味着02 CONSTRAINT之前添加了FOREIGN KEY- 为什么,它有什么作用?

CODE_SAMPLE_01:

FOREIGN KEY (TABLE_02_nID_FK__TABLE_01_sID_PK) REFERENCES TABLE_01(TABLE_01_sID_PK),
Run Code Online (Sandbox Code Playgroud)

背景:

CREATE TABLE `TABLE_02` (
  `TABLE_02_sID_PK` int(8) NOT NULL,
  `TABLE_02_nID_FK__TABLE_01_sID_PK` int(8) NOT NULL,
  `TABLE_02_cID` int(8) NOT NULL,
  `TABLE_02_data01` varchar(128) default NULL,
  `TABLE_02_data02` varchar(128) NOT NULL,
  `create_timestamp` DATETIME DEFAULT NULL,
  `update_timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`TABLE_02_sID_PK`),
  FOREIGN KEY (TABLE_02_nID_FK__TABLE_01_sID_PK) REFERENCES TABLE_01(TABLE_01_sID_PK),
  INDEX `TABLE_02_nID_FK__TABLE_01_sID_PK` (`TABLE_02_nID_FK__TABLE_01_sID_PK`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

CODE_SAMPLE_02:

CONSTRAINT `table_02_ibfk_1` FOREIGN KEY (`TABLE_02_nID_FK__TABLE_01_sID_PK`) REFERENCES `table_01` (`TABLE_01_sID_PK`)
Run Code Online (Sandbox Code Playgroud)

背景:

CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

mysql ddl referential-integrity

6
推荐指数
1
解决办法
1064
查看次数

MYSQL多次连接表

我有一个表,与事件的行,而且每一个(其中包括很多其他领域)addedbyuser,editedbyuser,deletedbyuserINT,并参考回users表到一个特定的用户.我可以加入其中一个字段(比如说addedbyuser)没有任何问题,我如何加入其余的并在php中引用它们?

事件表:

eventid addedbyuser editedbyuser deletedbyuser
1       1           2            3
Run Code Online (Sandbox Code Playgroud)

用户表:

id username
1  name1
2  name2
3  name3
Run Code Online (Sandbox Code Playgroud)

所以基本上,我想显示添加,编辑和删除文章的人的姓名,我可以在一个SQL查询中执行此操作吗?

mysql sql referential-integrity join foreign-keys

6
推荐指数
1
解决办法
1642
查看次数

SQL Server外键到多个表

我有以下数据库架构:

members_company1(id, name, ...);
members_company2(id, name, ...);
profiles(memberid, membertypeid, ...);
membertypes(id, name, ...)
[ 
       { id : 1, name : 'company1', ... }, 
       { id : 2, name : 'company2', ... }
];
Run Code Online (Sandbox Code Playgroud)

因此,每个配置文件属于某个成员,来自company1或company2,具体取决于membertypeid

members_company1     —————————      members_company2     
————————————————                    ————————————————
id      ——————————> memberid <———————————         id
name               membertypeid                 name
                       /|\
                        |  
                        |  
      profiles          |  
      ——————————        |  
      memberid  ————————+  
      membertypeid
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在profiles表中为参照完整性创建一个外键,memberid并且membertypeid可以引用member_company1或members_company2表记录?

sql t-sql sql-server referential-integrity foreign-keys

6
推荐指数
1
解决办法
2万
查看次数

如何处理相互递归的插入

我有一个定义相互递归表的模型:

Answer
  questionId QuestionId
  text

Question
  text
  correct AnswerId
Run Code Online (Sandbox Code Playgroud)

实际插入问题需要做什么?我需要先知道正确答案是什么.但要插入答案,我需要知道它回答了什么问题.

如果重要的话,我正在运行Postgres.

DDL是:

CREATE TABLE answer (
  id integer NOT NULL,                -- answer id
  text character varying NOT NULL,    -- answer text
  question_id bigint NOT NULL         -- question id
);

CREATE TABLE question (
  id integer NOT NULL,                 -- question id
  question character varying NOT NULL, -- question text
  correct bigint NOT NULL,             -- correct answer
  solution character varying NOT NULL  -- solution text
);

ALTER TABLE ONLY answer ALTER COLUMN …
Run Code Online (Sandbox Code Playgroud)

sql postgresql database-design referential-integrity foreign-keys

6
推荐指数
1
解决办法
1062
查看次数

查询以查找所有FK约束及其引用的表列

我有一个大的SQL 2012数据库(100个表),其中我需要找到参照操作设置为CASCADE(更新或删除)的所有约束.

这个有用的答案中,我看到我可以使用以下T-SQL列出约束(略微改编):

SELECT
    name,
    delete_referential_action_desc,
    update_referential_action_desc
FROM
    sys.foreign_keys
WHERE
    update_referential_action_desc = 'CASCADE' OR
    delete_referential_action_desc = 'CASCADE';
Run Code Online (Sandbox Code Playgroud)

这提供了一个有用的列表:

name        delete_referential_action_desc      update_referential_action_desc
----------------------------------------------------------------------
FK_name001  CASCADE                             CASCADE
FK_name002  CASCADE                             NO_ACTION
FK_name003  CASCADE                             NO_ACTION
Run Code Online (Sandbox Code Playgroud)

但是,是否可以扩展代码,以便为每个约束包含相应的表名和列名,例如?

name        delete_referential_action_desc      update_referential_action_desc  ParentTable ParentCol   ChildTable  ChildCol
----------------------------------------------------------------------------------------------------------------------------
FK_name001  CASCADE                             CASCADE                         Table1      Col1        Table2      Col2
Run Code Online (Sandbox Code Playgroud)

我尝试过不同的编辑从中提取值sys.objects但无法弄清楚它是如何工作的,或者这是否是正确的方法.

更新

请注意,我不想ALTER任何东西,或作出任何架构更改.我只是想查看一个列表,以便我可以手动执行进一步的操作.我没有信心或经验来编辑这个巨大的查询来拉出重点.

t-sql referential-integrity sql-server-2012

6
推荐指数
1
解决办法
3871
查看次数

关系数据仓库中的参照完整性.这值得么?什么是替代品?

如果你必须使用SQL Server 2008构建一个圣经比例的关系数据仓库,你会使用外键来强制数据完整性,还是会使用其他方法?

我喜欢外键,因为你只需要将它们弄好一次,它们总是在那里保护完整性.我正在考虑去禁用,加载,启用路由.

有什么想法吗?

提前致谢.

sql-server database-design referential-integrity data-warehouse

5
推荐指数
1
解决办法
1635
查看次数

5
推荐指数
2
解决办法
6356
查看次数

涉及多个表的外键约束

我在 Postgres 9.3 数据库中有以下场景:

  • 表 B 和 C 参考表 A。
  • 表 C 有一个引用表 B 的可选字段。

我想确保对于引用表 B 的表 C 的每一行,cba = ca 也就是说,如果 C 引用了 B,那么两行都应该指向表 A 中的同一行。

  • 我可以重构表 C,以便如果指定了 cb,则 ca 为空,但这会使连接表 A 和 C 的查询变得笨拙。
  • 我也许还可以让表 B 的主键包括它对表 A 的引用,然后让表 C 对表 B 的外键包括表 C 对表 A 的引用,但我认为这种调整太笨拙而无法证明好处的合理性。
  • 我认为这可以通过在表 C 上插入/更新之前运行并拒绝违反指定约束的操作的触发器来完成。

在这种情况下,是否有更好的方法来强制执行数据完整性?

postgresql database-design referential-integrity constraints foreign-keys

5
推荐指数
1
解决办法
353
查看次数

CQRS/DDD:检查引用完整性

命令处理程序是否还应该检查引用完整性?此常见问题解答建议您不要在聚合中检查此内容(http://cqrs.nu/Faq)。检查某些东西是否存在不是验证的一部分吗?

例如,您可以拥有一个可以向文章添加评论的应用程序。

该命令将包含以下字段:

  • ID
  • 文章编号
  • 用户身份
  • 文本

对于此示例,评论和文章是不同的聚合根。

如果文章已经存在且用户存在,您是否应该检查此示例?可以给不存在的文章添加评论,感觉有点奇怪。

referential-integrity domain-driven-design cqrs

5
推荐指数
1
解决办法
1098
查看次数