MySQL使用外键将数据插入到表中,外键不是引用表的主键

MySQL使用外键将数据插入到表中,外键不是引用表的主键,mysql,reference,insert,foreign-keys,Mysql,Reference,Insert,Foreign Keys,我有一个表歌曲,其中包含艺术家姓名和流派作为外键,但它们不是艺术家和流派表中的主键。我希望将数据输入歌曲表并自动填充到其他两个表中,除非我的逻辑错误。这是歌曲表: CREATE TABLE IF NOT EXISTS `project`.`song` ( `idsong` INT(11) NOT NULL AUTO_INCREMENT , `artistname` VARCHAR(45) NULL DEFAULT NULL , `title` VARCHAR(45) NULL DEFAULT

我有一个表歌曲,其中包含艺术家姓名和流派作为外键,但它们不是艺术家和流派表中的主键。我希望将数据输入歌曲表并自动填充到其他两个表中,除非我的逻辑错误。这是歌曲表:

 CREATE  TABLE IF NOT EXISTS `project`.`song` (
`idsong` INT(11) NOT NULL AUTO_INCREMENT ,
`artistname` VARCHAR(45) NULL DEFAULT NULL ,
`title` VARCHAR(45) NULL DEFAULT NULL ,
`genre` VARCHAR(15) NULL DEFAULT NULL ,
`year` INT(4) NULL DEFAULT NULL ,
`lyrics` TEXT NULL DEFAULT NULL ,
`url` VARCHAR(45) NULL DEFAULT NULL ,
PRIMARY KEY (`idsong`) ,
INDEX `title` (`title` ASC) ,
INDEX `genre_idx` (`genre` ASC) ,
INDEX `artistname_idx` (`artistname` ASC) ,
CONSTRAINT `genre`
FOREIGN KEY (`genre` )
REFERENCES `project`.`genres` (`genre` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `artistname`
FOREIGN KEY (`artistname` )
REFERENCES `project`.`artist` (`artistname` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
另外两张表:

CREATE  TABLE IF NOT EXISTS `project`.`genres` (
`genre` VARCHAR(15) NOT NULL ,
 PRIMARY KEY (`genre`) )
 ENGINE = InnoDB

 CREATE  TABLE IF NOT EXISTS `project`.`artist` (
`idartist` INT(11) NOT NULL AUTO_INCREMENT ,
`artistname` VARCHAR(45) NULL DEFAULT NULL ,
`bio` TEXT NULL DEFAULT NULL ,
PRIMARY KEY (`idartist`) ,
INDEX `artistname` (`artistname` ASC) )
ENGINE = InnoDB
这是我不起作用的查询:

INSERT INTO song (artist, title, genre, year, lyrics, url)
    VALUES
    ('Jason Aldean', 'Night Train', 'Country', '2012', 'This is the song lyrics', '9ADpkg1dkDU');

你知道怎么了吗?我是一个新手,所以我确信它是用户:)

这不会像你想的那样工作:外键约束可以在删除级联时执行
,在更新级联时执行
,但不能在插入级联时执行


您需要的是在歌曲表上插入
触发器之前插入一个
,如果需要,它将填充引用的表。

那么如何添加触发器?我使用MySQL Workbench创建了模型,它直接将模型导入MySQL服务器。或者我应该为每个表将查询分解为单独的查询吗?谢谢您将需要研究MySQL文档中的触发器,这非常简单,只需考虑为每一新行调用一个存储过程即可。如果你能分解你的查询,这也会起作用,但在并发性问题上您会遇到麻烦:设想两个脚本同时插入同一个新艺术家。如果在歌曲表中插入值时未退出,我如何设置触发器以首先在艺术家表中添加艺术家名称?在触发器中,您会运行类似于
插入忽略艺术家…
-这是确保您的艺术家行存在。由于它是INSERT之前的
触发器,因此新创建的行可以被查询的主要部分引用以插入到song中