使用单个查询从 2 个表中删除行
Delete rows from 2 tables using a single query
我有以下数据库模式:
我有以下示例数据:
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');
备注:table本来都是GUID,为了方便阅读,我用名字代替了。
我还用一些示例数据创建了一个 SQL-Fiddle:Link
.
以示例数据为例,我想从计算机“Computer2”中删除打印机“PRT01”。
我需要删除 table computermapping
中的相应行,我需要删除 table computerdefaultprinter
中的相应行。我想使用一条语句删除 BOTH table 中提到的数据。
根据我的程序代码,我需要使用 NOT IN()
来定位数据。
到现在为止,我成功地使用了 2 个语句 joined/glued 通过 ";":
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”删除两个 table 中的行,但我无法让它工作,我正在寻求帮助。
谢谢
您可以使用 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 中的 运行 示例。
我有以下数据库模式:
我有以下示例数据:
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');
备注:table本来都是GUID,为了方便阅读,我用名字代替了。
我还用一些示例数据创建了一个 SQL-Fiddle:Link
.
以示例数据为例,我想从计算机“Computer2”中删除打印机“PRT01”。
我需要删除 table computermapping
中的相应行,我需要删除 table computerdefaultprinter
中的相应行。我想使用一条语句删除 BOTH table 中提到的数据。
根据我的程序代码,我需要使用 NOT IN()
来定位数据。
到现在为止,我成功地使用了 2 个语句 joined/glued 通过 ";":
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”删除两个 table 中的行,但我无法让它工作,我正在寻求帮助。
谢谢
您可以使用 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 中的 运行 示例。