2013-10-01 4 views
0
create table Person(
    SSN INT, 
    Name VARCHAR(20), 
    primary key(SSN) 
); 
create table Company(
CompanyID INT, 
Name VARCHAR(20) 
primary key(SSN) 

create table Car(
    PlateNr INT, 
    Model VARCHAR(20), 
    primary key(PlateNr) 
); 

create table CarOwner(
    SSN INT, 
    PlateNr INT, 
    primary key(SSN, PlateNR) 
    foreign key(SSN) references Person (SSN), 
    foreign key(PlateNr) references Car (PlateNr) 
); 

create table CompanyWorker(
    SSN INT, 
    CompanyID INT 
    primary key(SSN, CompanyID), 
    foreign key(SSN) references Person (SSN), 
    foreign key(CompanyID) references Company (CompanyID) 
); 

Insert into Person(SSN, Name) VALUES ('123456789','Max'); 
Insert into Person(SSN, Name) VALUES ('123456787','John'); 
Insert into Person(SSN, Name) VALUES ('123456788','Tom'); 

insert into Company(CompanyID, Name) VALUES('1','IKEA'); 
insert into Company(CompanyID, Name) VALUES('2','Starbucks'); 

Insert into Car(PlateNr, Model) VALUES ('123ABC','Volvo'); 
Insert into Car(PlateNr, Model) VALUES ('321CBA','Toyota'); 
Insert into Car(PlateNr, Model) VALUES ('333AAA','Honda'); 

Insert into CarOwner(SSN, PlateNr) VALUES ('123456789','123ABC'); 
Insert into CarOwner(SSN, PlateNr) VALUES ('123456787','333AAA'); 
Insert into CarOwner(SSN, PlateNr) VALUES ('123456788','321CBA'); 

insert into CompanyWorker(SSN, CompanyID) VALUES('123456789','1'); 
insert into CompanyWorker(SSN, CompanyID) VALUES('123456787','1'); 

Это мои таблицы и вставляются в эти таблицы, и проблема, с которой я сталкиваюсь, заключается в удалении человека. Я хочу, чтобы иметь возможность удалить человека из таблицы «Человек», примерУдаление данных из нескольких таблиц

DELETE FROM Person WHERE SSN = '123456789'; 

Но проблема в том, что я должен удалить человека из всех других таблиц, которые указанное лицо имеет отношение с. У человека есть отношения с CarOwner и CompanyWorker. Конечно, я мог бы просто выполнить три раздельные удалить-заявления сразу:

DELETE FROM Person WHERE SSN = '123456789'; 
DELETE FROM CarOwner WHERE SSN = '123456789'; 
DELETE FROM CompanyWorker WHERE SSN = '123456789'; 

Но если ПЛА не существует в CompanyWorker я столкнуться с проблемами, так как он пытается удалить то, что не суммируется и не существует там. Поэтому мне нужно как-то проверить, существует ли он прежде, чем удаляться, это моя проблема.

+2

«Но если этот ПЛА не существует в CompanyWorker я столкнуться с проблемами, так как это пытаясь удалить что-то, что там не существует. Поэтому мне нужно как-то проверить, существует ли он раньше, прежде чем удалять какую-то проблему, это моя проблема ». Нет, это не так, просто ничего не удалит. Если SSN не существует, ошибки не будет, оно просто ничего не удалит. Имею 3 заявления о прекращении. –

+0

Нет проблем с наличием 3 инструкций удаления, это не приведет к сбою, потому что ваш SSN не существует, он просто не удалит строки. Вы можете добавить предложение DELETE CASCADE на свой внешний ключ, поэтому, когда вы удалите ЧЕЛОВЕК, он удалит все строки, связанные с другими таблицами. – FloChanz

+0

Посмотрите ссылочную целостность и каскадное удаление - должно предоставить вам то, что вам нужно. – Andrew

ответ

1

Если вы используете MSSQL в качестве движка базы данных, вы можете ALTER TABLE, чтобы добавить ИНОСТРАННОЙ CONSTRAINT с ON DELETE CASCADE

ALTER TABLE CarOwner 
    ADD CONSTRAINT FK_CarOwner_SSN 
     FOREIGN KEY (SSN) 
     REFERENCES Person (SSN) 
     ON DELETE CASCADE 
Смежные вопросы