【问题标题】:MySQL insert data into table with foreign keys that are no the primary key of the reference tableMySQL将数据插入表中,外键不是参考表的主键
【发布时间】:2012-11-27 00:25:58
【问题描述】:

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

 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 reference insert foreign-keys


    【解决方案1】:

    这不会像你想象的那样工作:外键约束可以做ON DELETE CASCADEON UPDATE CASCADE,但不能做像ON INSERT CASCADE 这样的事情。

    您需要的是歌曲表上的BEFORE INSERT 触发器,如果​​需要,它将填充引用的表。

    【讨论】:

    • 那么如何添加触发器呢?我使用 MySQL Workbench 制作了模型,将其直接导入 mysql 服务器。或者我应该为每个表将查询分成单独的查询?谢谢!
    • 您需要从 MySQL 文档中研究触发器,这很容易,只需考虑为每个新行调用的存储过程。如果你可以分解你的查询,这也可以工作,但你会在并发问题上遇到麻烦:想想两个脚本同时插入同一个新艺术家。
    • 如果在歌曲表中插入值时没有退出,我该如何设置触发器先将艺术家名添加到艺术家表中?
    • 在触发器中,您将运行类似INSERT IGNORE INTO artist ... 的内容 - 这可以确保您的艺术家行存在。由于它是BEFORE INSERT 触发器,因此新创建的行可以被查询的主要部分引用以插入到歌曲中
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多