有 2 个表“用户”和“地址”。
create table address (
username varchar(255) not null,
address1 varchar(255),
primary key (username)
)
和
create table users (
user_id varchar(255) not null,
username varchar(255) not null,
address varchar(255) not null,
primary key (user_id)
)
“用户”表有几列,包括一个名为“地址”的列,这个“用户”表被修改为
1. alter table if exists users add constraint uk_users_username unique (username)
2. alter TABLE users ADD CONSTRAINT fk_user_address FOREIGN KEY(address) REFERENCES address(username) ON DELETE RESTRICT ON UPDATE CASCADE
(只是试图建立“用户”到“地址”的一对一单向关系)
现在,正如预期的那样,当我在“users”表中添加一条有效记录时,它会自动在“address”表中添加一条记录。此外,当我使用以下 DELETE sql 之一时
1. delete from users where user_id = 'some_user_id';
2. delete from users where username = 'some_user_name';
它会按照预期从“用户”表中删除记录;但不会删除“地址”中的相关记录。
问题:它不应该抱怨“用户”表对“地址”有约束,并且直到“地址”中的相关记录也被删除之前,这个“用户”不能被删除(因为我们有...ON DELETE RESTRICT ON UPDATE CASCADE)?
提前致谢!!
ON DELETE RESTRICT
如果有子表指向父表,则阻止从父表中删除记录。但是,在您的情况下,您正在定义users
表上的外键 (FK) 并引用address
,使其成为users
子表和address
父表。因此,尽管存在约束,您仍然可以从中删除users
。如果您希望约束按您描述的方式工作,则必须将它们翻转并将外键 (FK) 放在address
表上。定义外键时,所有者表成为关系中的“子表”,被引用的表成为父表。
ON DELETE RESTRICT
保护父表,而不是子表。另外,一般来说,在包含业务相关数据的列上添加外键约束是不明智的。你的用户名今天可能是唯一的,但过了一段时间后,可能会有人希望它们不再是唯一的。添加外键约束会使这种情况变得不可能。更好的做法是,在记录的 id 上添加外键约束,并且你应该始终使用与业务无关的唯一标识符(例如生成的 id)。