【发布时间】:2022-01-09 09:01:03
【问题描述】:
我需要从“Customer”表中删除一个消费者,并从“ContactDetails”、“Invoice”和“ServiceTicket”表中删除与他相关的所有数据。
这是表格:
CREATE TABLE ContactDetail (
DetailID integer IDENTITY(1,1) PRIMARY KEY,
FirstName varchar(40) NOT NULL,
SurName varchar(40) NOT NULL,
DoB date NOT NULL,
Address01 varchar(80) NOT NULL,
Address02 varchar(80),
City varchar(40) NOT NULL,
County varchar(40) NOT NULL,
EirCode varchar(8) NOT NULL,
Email varchar(40),
PhoneNumber varchar(20),
MobileNumber varchar(20) NOT NULL
);
CREATE TABLE Customer (
CustomerID varchar(9) PRIMARY KEY,
DetailID integer FOREIGN KEY REFERENCES ContactDetail(DetailID),
LastActivity date NOT NULL,
CustumerStatus varchar(9) NOT NULL
);
CREATE TABLE SalesPerson (
SalesPersonID varchar(9) PRIMARY KEY,
DetailID integer FOREIGN KEY REFERENCES ContactDetail(DetailID)
);
CREATE TABLE Mechanic (
MechanicID varchar(9) PRIMARY KEY,
DetailID integer FOREIGN KEY REFERENCES ContactDetail(DetailID)
);
CREATE TABLE Car (
CarSerialNumber varchar(12) PRIMARY KEY,
CarIsForSale varchar(1) NOT NULL,
CarCondition varchar(1) NOT NULL,
CarMiliage integer,
CarMake varchar(40),
CarModel varchar (40),
CarYear date,
CarColor varchar (20),
CarTransmission varchar (10),
CarEngineSize varchar (10),
CarFuelType varchar (10),
CarDoors integer,
CarBodyStyle varchar (20),
CarSalePrice decimal (19,4)
);
CREATE TABLE Invoice (
InvoiceNumber integer IDENTITY(1,1) PRIMARY KEY,
SalesPersonID varchar(9) FOREIGN KEY REFERENCES SalesPerson(SalesPersonID),
CustomerID varchar(9) FOREIGN KEY REFERENCES Customer(CustomerID),
CarSerialNumber varchar(12) FOREIGN KEY REFERENCES Car(CarSerialNumber),
InvoiceDate datetime NOT NULL,
);
CREATE TABLE ServiceTicket (
ServiceNumber varchar(9) PRIMARY KEY,
MechanicID varchar(9) FOREIGN KEY REFERENCES Mechanic(MechanicID),
CustomerID varchar(9) FOREIGN KEY REFERENCES Customer(CustomerID),
CarSerialNumber varchar(12) FOREIGN KEY REFERENCES Car(CarSerialNumber),
ServiceTicketDate date NOT NULL,
ServiceDue date NOT NULL,
ServiceDescription varchar (80) NOT NULL,
ServicePrice decimal(19,4) NOT NULL,
);
【问题讨论】:
-
为使用的数据库添加标签。数据库是否具有关系完整性和级联删除功能集(例如可以在 Access 中完成)。为每个表运行 DELETE 操作 SQL。为什么还要删除数据?
-
您不能使用单个查询从多个表中删除行。我建议在
Customer表上使用 DELETE 触发器,从它们各自的表中删除其他条目。请参阅 this answer 了解其工作原理。 -
好吧,您可以更改设计并在
contactdetail中引用customer,而不是反过来,并将引用customer的外键的操作设置为ON DELETE CASCADE。然后,当客户被删除时,这将自动删除所有相关数据。 -
@Jesse 这是给 Oracle 的,请参阅下面我的回答
标签: sql foreign-keys parent-child sql-delete delete-row