在下表中,是否有办法确保 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复制),复合外键不会强制执行此操作: …
我看过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) 我有一个表,与事件的行,而且每一个(其中包括很多其他领域)addedbyuser,editedbyuser,deletedbyuser
有INT,并参考回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查询中执行此操作吗?
我有以下数据库架构:
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表记录?
我有一个定义相互递归表的模型:
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
我有一个大的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任何东西,或作出任何架构更改.我只是想查看一个列表,以便我可以手动执行进一步的操作.我没有信心或经验来编辑这个巨大的查询来拉出重点.
如果你必须使用SQL Server 2008构建一个圣经比例的关系数据仓库,你会使用外键来强制数据完整性,还是会使用其他方法?
我喜欢外键,因为你只需要将它们弄好一次,它们总是在那里保护完整性.我正在考虑去禁用,加载,启用路由.
有什么想法吗?
提前致谢.
sql-server database-design referential-integrity data-warehouse
我在 Postgres 9.3 数据库中有以下场景:
我想确保对于引用表 B 的表 C 的每一行,cba = ca 也就是说,如果 C 引用了 B,那么两行都应该指向表 A 中的同一行。
在这种情况下,是否有更好的方法来强制执行数据完整性?
postgresql database-design referential-integrity constraints foreign-keys
命令处理程序是否还应该检查引用完整性?此常见问题解答建议您不要在聚合中检查此内容(http://cqrs.nu/Faq)。检查某些东西是否存在不是验证的一部分吗?
例如,您可以拥有一个可以向文章添加评论的应用程序。
该命令将包含以下字段:
对于此示例,评论和文章是不同的聚合根。
如果文章已经存在且用户存在,您是否应该检查此示例?可以给不存在的文章添加评论,感觉有点奇怪。
foreign-keys ×5
sql ×4
mysql ×3
sql-server ×3
postgresql ×2
t-sql ×2
constraints ×1
cqrs ×1
ddl ×1
join ×1