这是我创建 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 borrowerId
FOREIGN 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;