2013-05-11 2 views
0

Я не профессионал MySQL Я просто пытаюсь создать простое java-приложение, которое обращается к базе данных MySQL (например, к известной базе данных книг/авторов) и манипулирует ею (то есть добавляет, Удалить).Удалить из многих во многие отношения в MySQL

Проблема заключается в том, что есть две таблицы, которые имеют отношения многие ко многим (например, авторы таблицы и книги таблицы), когда я пытаюсь удалить, используя

DELETE FROM tableName WHERE someColumnName = 'someValue' 

он бросает MySQLIntegrityConstraintViolationException с сообщением «Не удается удалить или обновить родительскую строку: сбой внешнего ключа завершен «

Я знаю, что это связано с отношением« многие ко многим », но на самом деле я не знаю, что с этим делать, поскольку я не профессионал MySQL. Любая помощь будет оценена. Спасибо.

Edit: здесь база данных

DROP DATABASE IF EXISTS books; 

CREATE DATABASE books; 

USE books; 

CREATE TABLE Authors 
(
    AuthorID int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    FirstName varchar(30) NOT NULL, 
    LastName varchar(30) NOT NULL 
)     ; 
CREATE TABLE Titles 
(
    ISBN varchar(20) NOT NULL PRIMARY KEY, 
    Title varchar(100) NOT NULL, 
    EditionNumber int NOT NULL, 
    Copyright varchar(4) NOT NULL 
)    ; 

CREATE TABLE AuthorISBN 
(
    AuthorID int NOT NULL, 
    ISBN varchar(20) NOT NULL, 
    FOREIGN KEY (AuthorID) REFERENCES Authors(AuthorID) ON DELETE SET NULL, 
    FOREIGN KEY (ISBN) References Titles(ISBN) ON DELETE SET NULL 
)   ; 

INSERT INTO Authors (FirstName,LastName) VALUES ('Paul','Deitel')   ; 
INSERT INTO Authors (FirstName,LastName) VALUES ('Harvey','Deitel')  ; 
INSERT INTO Authors (FirstName,LastName) VALUES ('Abbey','Deitel')  ; 
INSERT INTO Authors (FirstName,LastName) VALUES ('Michael','Morgano') ; 
INSERT INTO Authors (FirstName,LastName) VALUES ('Eric','Kern')  ; 


INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132152134','Visual Basic 2010 How to Program',5,'2011')   ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132152134')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132152134') ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132151421','Visual C# 2010 How to Program',4,'2011') ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132151421')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132151421')  ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132575663','Java How to Program',9,'2012') ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132575663')            ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132575663')          ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132662361','C++ How to Program',8,'2012')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132662361')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132662361')             ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132404168','C How to Program',6,'2010')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132404168')            ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132404168')          ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('013705842X','iPhone for Programmers: An App-Driven Approach',1,'2010')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'013705842X')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'013705842X')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (3,'013705842X')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (4,'013705842X')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (5,'013705842X')             ; 

INSERT INTO Titles (ISBN,Title,EditionNumber,Copyright) VALUES ('0132121360','Android for Programmers: An App-Driven Approach',1,'2012')  ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (1,'0132121360')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (2,'0132121360')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (3,'0132121360')             ; 
INSERT INTO AuthorISBN (AuthorID,ISBN) VALUES (4,'0132121360')             ; 

ответ

0

Исправлена ​​проблема, удалив NOT NULL слова и добавление ON DELETE CASCADE и ON UPDATE CASCADE после обоих FOREIGN KEY заявления.

+1

Вы должны быть осторожны, используя 'ON CASCADE'. Использование его неправильно может привести к удалению данных, которые вы не хотите. Поэтому я предлагаю вместо этого использовать «SET NULL» или «NO ACTION». – Christian

1

Это, вероятно, потому, что вы установили CONSTRAINTonUpdate и onDelete к RESTRICT. Вы можете изменить его на SET NULL, а затем сможете удалить.

См. this section в документации по MySQL.

EDIT

за SET NULL, вы можете попробовать NO ACTION вариант.

IE:

FOREIGN KEY(ord_no,book_id) REFERENCES neworder(ord_no,book_id) 
ON UPDATE SET NULL ON DELETE SET NULL 

ИЛИ

FOREIGN KEY(ord_no,book_id) REFERENCES neworder(ord_no,book_id) 
ON UPDATE NO ACTION ON DELETE NO ACTION 

Надеется, что это помогает.

+0

Это должно быть сделано непосредственно в исходном файле базы данных? – Kareem

+0

да. Если вы уже создали базу данных и хотите добавить какое-то ограничение, просто поставьте «ALTER TABLE книжный магазин ADD» перед кодом выше. – Christian

+0

'FOREIGN KEY (AuthorID) СПИСОК ЛИТЕРАТУРЫ Авторы (AuthorID) ON DELETE SET NULL, FOREIGN KEY (ISBN) Ссылки Названия (ISBN) ON DELETE SET NULL' это неправильно синтаксис? Я получаю ошибку (42s02) при создании базы данных. – Kareem

Смежные вопросы