我创建了两个表格,例如marks
和users
。我维护了两个表之间的外键关系,当我删除marks
表中的一行时,我需要删除基于两个表中存在的uid
的用户表中的特定用户。任何人都建议我?
答案 0 :(得分:3)
如果要在父表中删除相应的行时在子表中删除行,请使用ON DELETE CASCADE选项。
但你的情况与此相反。没有办法逆转 自动。
删除记录时,您需要显式使用删除触发器 来自儿童桌。
顺便说一句,反向操作是不安全的,因为单个用户可能有许多标记记录,如果删除其中任何一个,则用户将从用户表中删除。
我建议在sproc中逻辑地进行。
你可以在sproc中检查用户的所有记录都在标记表中删除,而不是从用户表中删除用户。
答案 1 :(得分:2)
对于您的情况,我建议您使用on delete cascade
更多信息:
具有级联删除的外键意味着如果删除父表中的记录,则将自动删除子表中的相应记录。这在SQL Server中称为级联删除。
使用SQL Server(Transact-SQL)中的CREATE TABLE语句通过级联删除创建外键的语法是:
CREATE TABLE child_table
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
ON DELETE CASCADE
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
更多阅读this
答案 2 :(得分:0)
在设计中只使用删除级联
CREATE TABLE child_table
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
ON DELETE CASCADE
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
现在删除父级时。孩子会自动删除......你不需要做任何事情
检查链接的详细信息 On delete cascade
答案 3 :(得分:0)
由于我不喜欢DELETE
来自相关表格的任何行,我建议您使用此解决方案:
status
字段的默认值1
添加到您的表格中。VIEW
,仅显示status <> 0
行,并使用此VIEW
显示有效数据。
对于父子或相关表,只显示父{C}和子表的
status <> 0
行,如parent.status * child.status <> 0
。
log
表或journal
并存储一些操作,如Create
,{{1 },Edit\Modify
,Delete
等等。
Undelete
和Undo
。Redo
行动!还有许多其他好处,您只需存储与RDBMS无关的更多数据。
我只将Undelete
用于最终子点的表,其数据不是那么重要。