mysql图书(书号,书名,作者编号,价格,出版社编号) 作者(编号,姓名,电话) 出版社(编号,出版社名称,地址) 建立作者的delete 触发器,只有当此作者没有任何作品才可删除,若有出书的记录不能删除。
时间: 2023-07-31 17:08:36 浏览: 88
简单的图书的增、删、改、查(数据库为MySql)
好的,针对这个问题,我可以给出一个 MySQL 数据库的解决方案。
首先,我们需要创建三张表:`books`,`authors` 和 `publishers`。具体的 SQL 代码如下:
```sql
CREATE TABLE books (
book_id INT PRIMARY KEY AUTO_INCREMENT,
book_name VARCHAR(255) NOT NULL,
author_id INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
publisher_id INT NOT NULL,
FOREIGN KEY (author_id) REFERENCES authors (author_id),
FOREIGN KEY (publisher_id) REFERENCES publishers (publisher_id)
);
CREATE TABLE authors (
author_id INT PRIMARY KEY AUTO_INCREMENT,
author_name VARCHAR(255) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE publishers (
publisher_id INT PRIMARY KEY AUTO_INCREMENT,
publisher_name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL
);
```
接下来,我们需要创建一个名为 `check_author_books` 的存储过程,用于检查某个作者是否有任何作品。具体的 SQL 代码如下:
```sql
DELIMITER //
CREATE PROCEDURE check_author_books(IN author_id INT, OUT can_delete BOOL)
BEGIN
DECLARE book_count INT DEFAULT 0;
SELECT COUNT(*) INTO book_count FROM books WHERE author_id = author_id;
IF book_count > 0 THEN
SET can_delete = FALSE;
ELSE
SET can_delete = TRUE;
END IF;
END//
DELIMITER ;
```
最后,我们需要创建一个名为 `authors_delete_trigger` 的触发器,用于在删除作者时自动调用 `check_author_books` 存储过程。具体的 SQL 代码如下:
```sql
CREATE TRIGGER authors_delete_trigger
BEFORE DELETE ON authors
FOR EACH ROW
BEGIN
DECLARE can_delete BOOL;
CALL check_author_books(OLD.author_id, can_delete);
IF NOT can_delete THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete author with books';
END IF;
END;
```
现在,当你尝试删除一个有作品的作者时,MySQL 会抛出异常并阻止删除操作。只有当此作者没有任何作品时才可删除。
阅读全文