如何解决使用单个查询从 2 个表中删除行
我有以下示例数据:
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',(3,'Computer2'),(4,(5,'PRT03',(6,'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-fiddle:Link
.
以示例数据为例,我想从计算机“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”删除两个表中的行,但我无法让它工作,我正在寻求帮助。
谢谢
解决方法
您可以使用 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',(3,'Computer2'),(4,(5,'PRT03',(6,'Computer3');
CREATE TABLE computerdefaultprinter (
ComputerGUID 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 上的运行示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。