我想知道是否可以执行以下操作,我有3个表要从中删除数据:Table1,Table2,Table3
Table1
中始终有一条记录,Table2
和Table3
中可能有或没有相关记录。
所以我想我可以做以下事情:
DELETE FROM dbo.Table1, dbo.Table2, dbo.Table3
FROM Table1 t1
LEFT JOIN dbo.Table2 t2 ON t1.Id = t2.Id
LEFT JOIN dbo.Table3 t3 ON t3.Id = t1.Id
WHERE t1.Id = @Id;
但是由于Incorrect syntax near ','.
行,我得到了DELETE FROM dbo.Table1, dbo.Table2, dbo.Table3
。
理想的结果是使用Where
子句删除3个表中的所有数据。
我不确定如何完成此操作。
答案 0 :(得分:4)
您一次只能从一个表中删除。想必您需要级联约束:
alter table2 add constraint fk_table2_table1
foreign key (id) references table1(id)
on delete cascade;
alter tablee add constraint fk_tablee_table1
foreign key (id) references table1(id)
on delete cascade;
外键可确保数据完整性。级联约束意味着当删除主键时,其他表中的相应行也将被删除。
答案 1 :(得分:2)
对此有两种方法。就个人而言,我建议在触发条件上使用SP;像其他人一样,我也不是触发器的忠实拥护者,因为它们通常是一个“隐藏”的实体(很多时候我一直无法弄清为什么某个东西无法找到它是我不是的触发器知道)。
无论如何,触发方法将是:
initialDeposit += contribution
但是,由于您使用的是单个值,因此参数化存储过程会更好。然后让var monthCount = Math.ceil((targetSaving - initialDeposit)/contribution);
个用户在表上运行CREATE TRIGGER Cascade_Table2_Table3 ON dbo.Table1
AFTER DELETE
AS
DELETE T2
FROM Table2 T2
JOIN deleted d ON t2.Id = d.Id;
DELETE T3
FROM Table3 T3
JOIN deleted d ON t3.Id = d.Id;
GO
:
DENY
答案 2 :(得分:1)
您可以在table1上使用触发器吗?因此,您只能从table1中删除记录,然后让触发器从table2和table3中删除内容。
类似的东西:
CREATE TRIGGER [dbo].[T_deleteT2_t3]
ON [dbo].[Table1]
AFTER DELETE
AS
BEGIN
delete from table2 where id = select id from deleted
delete from table3 where id = select id from deleted
END
答案 3 :(得分:1)
这是使用 OUTPUT
子句
CREATE TABLE T1( ID INT);
CREATE TABLE T2( ID INT);
CREATE TABLE T3( ID INT);
INSERT INTO T1 VALUES (1), (2);
INSERT INTO T2 VALUES (1), (3);
INSERT INTO T3 VALUES (1), (4);
BEGIN TRAN;
DECLARE @Out TABLE (IDs INT);
DELETE T1
OUTPUT DELETED.ID INTO @Out
FROM T1 INNER JOIN T2 ON T1.ID = T2.ID;
DELETE T2
FROM T2 INNER JOIN @Out O ON T2.ID = O.IDs;
DELETE T3
FROM T3 INNER JOIN @Out O ON T3.ID = O.IDs;
COMMIT TRAN;
SELECT *
FROM T1;
SELECT *
FROM T2;
SELECT *
FROM T3;
答案 4 :(得分:0)
**DELETE t1,t2,t3 FROM**
FROM Table1 t1
LEFT JOIN dbo.Table2 t2 ON t1.Id = t2.Id
LEFT JOIN dbo.Table3 t3 ON t3.Id = t1.Id
WHERE t1.Id = @Id;