【问题标题】:Delete rows from 2 tables using a single query使用单个查询从 2 个表中删除行
【发布时间】:2021-01-11 12:44:22
【问题描述】:

我有以下数据库模式:

我有以下示例数据:

CREATE TABLE computermapping (
  ComputerMappingID int NOT NULL,
  PrinterGUID char(36) NOT NULL,
  ComputerGUID char(36) NOT NULL
);

INSERT INTO computermapping (ComputerMappingID, PrinterGUID, ComputerGUID) VALUES
(1, 'PRT01', 'Computer1'),
(2, 'PRT02', 'Computer1'),
(3, 'PRT01', 'Computer2'),
(4, 'PRT02', 'Computer2'),
(5, 'PRT03', 'Computer2'),
(6, 'PRT01', 'Computer3');

CREATE TABLE computerdefaultprinter (
  ComputerGUID char(36) NOT NULL,
  PrinterGUID char(36) NOT NULL
);

INSERT INTO computerdefaultprinter (ComputerGUID, PrinterGUID) VALUES
('Computer2', 'PRT01'),
('Computer1', 'PRT02');

备注:最初表格中充满了 GUID,但为了更好的可读性,我将它们替换为名称。

我还创建了一个带有一些示例数据的 SQL-FiddleLink

.

以示例数据为例,我想从计算机“Computer2”中删除打印机“PRT01”。

我需要删除表computermapping 中的相应行,我需要删除表computerdefaultprinter 中的相应行。我想使用 ONE SINGLE 语句删除 BOTH 表中提到的数据。

根据我的程序代码,我需要使用NOT IN() 来定位数据。 到目前为止,我成功地使用了 2 个由“;”连接/粘合在一起的语句:

DELETE FROM computermapping WHERE PrinterGUID = 'PRT01' AND ComputerGUID NOT IN ('Computer1','Computer3');
DELETE FROM computerdefaultprinter WHERE PrinterGUID = 'PRT01' AND ComputerGUID NOT IN ('Computer1','Computer3')

这在使用 MySQL 时运行良好,但不适用于 Microsoft SQL-Server。是的,它确实使用 SQL Server Management Studio,但不是以编程方式。 (计数字段不正确或语法错误)

我正在为这项任务寻找一种不同的方法。 我做了一项研究,有人提到,应该可以使用“INNER JOIN”删除两个表中的行,但我无法让它工作,我正在寻求帮助。

谢谢

【问题讨论】:

  • 坏消息是大多数数据库不允许您从一个delete 中的不同 表中删除行。好消息是您可以使用级联外键约束或事务来有效地拥有相同的功能。不过,在您的情况下,只需发出两个 delete 命令。
  • ON DELETE CASCADE 添加缺少的外键,然后就可以了。
  • @TheImpaler 我从来没有用过这样的东西。可以举个例子吗?
  • “但不是以编程方式”是什么意思?
  • @Nick.McDermaid:我在 PHP 中使用 PDO,运行上述查询会引发错误。我相信因为 2 个结果...

标签: sql sql-server tsql sql-delete


【解决方案1】:

您可以使用ON DELETE CASCADE 添加外键。

例如:

CREATE TABLE computermapping (
  ComputerMappingID int NOT NULL,
  PrinterGUID char(36) NOT NULL,
  ComputerGUID char(36) NOT NULL,
  primary key (ComputerGUID, PrinterGUID)
);

INSERT INTO computermapping (ComputerMappingID, PrinterGUID, ComputerGUID) VALUES
(1, 'PRT01', 'Computer1'),
(2, 'PRT02', 'Computer1'),
(3, 'PRT01', 'Computer2'),
(4, 'PRT02', 'Computer2'),
(5, 'PRT03', 'Computer2'),
(6, 'PRT01', 'Computer3');

CREATE TABLE computerdefaultprinter (
  ComputerGUID char(36) NOT NULL,
  PrinterGUID char(36) NOT NULL,
  foreign key (ComputerGUID, PrinterGUID) 
    references computermapping (ComputerGUID, PrinterGUID)
    on delete cascade
);

INSERT INTO computerdefaultprinter (ComputerGUID, PrinterGUID) VALUES
('Computer2', 'PRT01'),
('Computer1', 'PRT02');

delete from computermapping 
where PrinterGUID = 'PRT01' and  ComputerGUID = 'Computer2';

DELETE 删除 computermapping 中的一行以及 computerdefaultprinter 中的所有相关行。

请参阅SQL Fiddle 的运行示例。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多