【问题标题】:Delete from Many to Many Relationship in MySQL在 MySQL 中从多对多关系中删除
【发布时间】:2013-05-13 17:15:46
【问题描述】:

我不是 MySQL 专业人士,我只是想制作简单的 Java 应用程序,它可以访问 MySQL 数据库(例如著名的书籍/作者数据库)并对其进行操作(即添加、更新、删除)。

问题是当我尝试使用删除时,有两个表具有多对多关系(例如作者表和书籍表)

DELETE FROM tableName WHERE someColumnName = 'someValue'

它抛出 MySQLIntegrityConstraintViolationException 消息“无法删除或更新父行:外键约束失败”

我知道这是因为“多对多”关系,但实际上我不知道该怎么做,因为我不是 MySQL 专业人士。任何帮助将不胜感激。谢谢。

编辑: 这是数据库

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')                                                    ;

【问题讨论】:

    标签: mysql many-to-many


    【解决方案1】:

    这可能是因为您将CONSTRAINT onUpdate 和onDelete 设置为RESTRICT。改成SET NULL就可以删除了。

    请参阅 MySQL 文档中的 this section。

    编辑

    除了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
    

    希望对你有帮助。

    【讨论】:

    • 这应该在数据库源文件本身中完成吧?
    • 是的。如果您已经创建了数据库并且想要添加一些约束,只需将ALTER TABLE bookstore ADD 放在上面的代码之前。
    • FOREIGN KEY (AuthorID) REFERENCES Authors(AuthorID) ON DELETE SET NULL, FOREIGN KEY (ISBN) References Titles(ISBN) ON DELETE SET NULL 这是错误的语法吗?创建数据库时出现错误(42s02)
    • sintaxe 没问题。似乎您在参考中分配了错误的字段。编辑您的问题并输入您正在使用的整个CREATE sintaxe。
    猜你喜欢
    • 2014-01-10
    • 2011-09-14
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多