sql - 带有 FK 和级联的参考表
问题描述
CREATE TABLE [clients] (
id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK___CLIENTS#id
PRIMARY KEY NONCLUSTERED,
name NVARCHAR(250) NOT NULL
CONSTRAINT UQ___CLIENTS#name
UNIQUE (name)
);
CREATE TABLE [contacts] (
id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK___CONTACTS#id
PRIMARY KEY NONCLUSTERED,
client_id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT FK___CONTACTS#client_id___CLIENTS#id
FOREIGN KEY REFERENCES [clients] (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
name NVARCHAR(250) NOT NULL
CONSTRAINT UQ___CONTACTS#name$client_id
UNIQUE (name, client_id)
);
CREATE TABLE [addresses] (
id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK___ADDRESSES#id
PRIMARY KEY NONCLUSTERED,
client_id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT FK___ADDRESSES#client_id___CLIENTS#id
FOREIGN KEY REFERENCES [clients] (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
name NVARCHAR(250) NOT NULL
CONSTRAINT UQ___ADDRESSES#name$client_id
UNIQUE (name, client_id)
);
CREATE TABLE [contacts_addresses] (
contact_id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT FK___CONTACTS_ADDRESSES#contact_id___CONTACTS#id
FOREIGN KEY REFERENCES [contacts] (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
address_id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT FK___CONTACTS_ADDRESSES#address_id___ADDRESSES#id
FOREIGN KEY REFERENCES [addresses] (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT PK___CONTACTS_ADDRESSES#contact_id$address_id
PRIMARY KEY (contact_id, address_id)
);
创建参考表时出现错误...
在表“contacts_addresses”上引入 FOREIGN KEY 约束“FK___CONTACTS_ADDRESSES#address_id___ADRESSES#id”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
无法创建约束或索引。
我认为这是因为两个父表都与 CLIENTS 表链接,但为什么不可能呢?
例如,我想删除客户记录,然后应该删除联系人以及客户的地址。如果发生这种情况,引用的记录(匹配的contact_id 和address_id)也应该被删除。
例如,我希望删除一个联系人记录,那么所有具有该contact_id 的引用记录都应该被删除。
例如,我希望删除一条地址记录,则应删除所有具有该 address_id 的引用记录。
但是怎么做?
解决方案
推荐阅读
- foreign-keys - TypeORM 关系:只有 ID 而不是整个实例
- haskell - 当我想在haskell(使用monads)中应用函数组合时,如何使用monad中的<=<运算符?
- angular - 即使我定义了属性名称也会出现错误
- ios - 如何在不破坏复杂布局的情况下从容器视图中删除?
- r - 将生效日期列表转换为开始日期和结束日期
- javascript - firebase 身份验证标识符是破折号而不是电子邮件地址
- ruby-on-rails - 尝试使用 respond_to 从另一个控制器获取变量
- javascript - setSelectionRange 未按预期工作
- python - 有没有一种pythonic方法来重写以下代码块?列出理解?
- api - 这些 PDF 在 VSCode 中似乎相同,但在 PDF 查看器中不同