CREATE TABLE due (
...,
d_invoice_id REFERENCES invoice (i_id),
d_loan_id REFERENCES loan (l_id),
...,
CHECK ( (d_invoice_id IS NULL AND d_loan_id IS NOT NULL)
OR (d_invoice_id IS NOT NULL AND d_loan_id IS NULL))
);
NOT NULL与其引用的列不同,定义了外键的列不必是。除此之外,您可以定义任意复杂性的检查——不过,建议将复杂性保持在必要的最低限度。
听起来,你不能用一个约束来解决这个问题,但是没有什么能阻止你定义更多的约束。我相信这样的事情应该有效:
NOT NULL
与其引用的列不同,定义了外键的列不必是。除此之外,您可以定义任意复杂性的检查——不过,建议将复杂性保持在必要的最低限度。我相信你不能有这样的约束。您可能有列约束或表约束。在处理外键时,它们在“指向”另一个表的表上,不能使用其他表的列。所以对表的约束
invoice
只能检查invoice
列而不能访问loan
列。load
您可以在和invoice
表上使用触发器来解决这个问题。触发器是函数,可以在它所附加的表之外的任何其他表上运行。