2

这是我创建 ER 图后的正向工程脚本:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';


DROP SCHEMA IF EXISTS `jocubooks` ;


CREATE SCHEMA IF NOT EXISTS `jocubooks` DEFAULT CHARACTER SET utf8 ;
USE `jocubooks` ;


DROP TABLE IF EXISTS `book` ;

CREATE TABLE IF NOT EXISTS `book` (
`ISBN` BIGINT(13) UNSIGNED NOT NULL,
`title` VARCHAR(100) NOT NULL,
`edition` VARCHAR(5) NULL,
`pubYear` YEAR NOT NULL,
PRIMARY KEY (`ISBN`),
UNIQUE INDEX `ISBN_UNIQUE` (`ISBN` ASC))
ENGINE = InnoDB;



DROP TABLE IF EXISTS `borrower` ;

CREATE TABLE IF NOT EXISTS `borrower` (
`borrowerId` INT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL,
`lastName` VARCHAR(50) NOT NULL,
PRIMARY KEY (`borrowerId`),
UNIQUE INDEX `borrowerId_UNIQUE` (`borrowerId` ASC))
ENGINE = InnoDB;



DROP TABLE IF EXISTS `bookStatus` ;

CREATE TABLE IF NOT EXISTS `bookStatus` (
`statusID` INT(2) NOT NULL,
`status` VARCHAR(45) NOT NULL,
PRIMARY KEY (`statusID`))
ENGINE = InnoDB;


DROP TABLE IF EXISTS `bookCopy` ;

CREATE TABLE IF NOT EXISTS `bookCopy` (
`bookId` INT NOT NULL AUTO_INCREMENT,
`loanPeriod` INT(3) NOT NULL DEFAULT 30 COMMENT 'in days',
`statusId` INT(2) NOT NULL,
`ISBN` BIGINT(13) UNSIGNED NOT NULL,
PRIMARY KEY (`bookId`),
INDEX `fk_bookCopy_bookStatus_idx` (`statusId` ASC),
INDEX `fk_bookCopy_book1_idx` (`ISBN` ASC),
CONSTRAINT `statusID`
FOREIGN KEY (`statusId`)
REFERENCES `bookStatus` (`statusID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bookCopy_book1`
FOREIGN KEY (`ISBN`)
REFERENCES `book` (`ISBN`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;



DROP TABLE IF EXISTS `bookLoan` ;

CREATE TABLE IF NOT EXISTS `bookLoan` (
`loanID` INT NOT NULL AUTO_INCREMENT,
`loanDate` DATE NOT NULL,
`returnDate` DATE NULL,
`borrowerId` INT NOT NULL,
`bookId` INT NOT NULL,
PRIMARY KEY (`loanID`),
INDEX `fk_bookLoan_borrower1_idx` (`borrowerId` ASC),
INDEX `fk_bookLoan_bookCopy1_idx` (`bookId` ASC),
CONSTRAINT `borrowerId`
FOREIGN KEY (`borrowerId`)
REFERENCES `borrower` (`borrowerId`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bookLoan_bookCopy1`
FOREIGN KEY (`bookId`)
REFERENCES `bookCopy` (`bookId`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

然后我尝试创建触发器来帮助更新一些表:

use jocubooks;


create trigger trigChangeStatus after insert on bookloan for each row
update bookcopy set statusID = 1 where bookId = NEW.bookId;

create trigger trigChangeStatusRet after update on bookloan for each row
update bookcopy set statusID = 0 where bookId = NEW.bookId;

我在这里遇到了我的子行错误,我尝试在第一个 Null 值中使用 16,认为它可能是自动递增的:

错误代码:1452。无法添加或更新子行:外键约束失败(jocubooks. bookloan, CONSTRAINT borrowerIdFOREIGN KEY ( borrowerId) REFERENCES borrower( borrowerId) ON DELETE NO ACTION ON UPDATE NO ACTION)

insert into bookloan values (NULL, DATE(NOW()), NULL, 5, 8);
update bookloan set returnDate = DATE(NOW()) where loanId = 3;

SELECT * FROM bookcopy;
4

0 回答 0