2012-11-27 83 views
2

我有一張包含藝術家名稱和流派作爲外鍵的表歌,但它們不是藝術家和流派表中的主鍵。我希望將數據輸入到歌曲表中並自動填充到另外兩個表中,除非我的邏輯錯誤。因此,這是歌曲表:MySQL將數據插入表中,其外鍵不是參考表的主鍵

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'); 

任何想法有什麼不對?我是個新手,所以我敢肯定,這是用戶:)

回答

1

這不會工作,你的思考方式:外鍵約束可以做ON DELETE CASCADEON UPDATE CASCADE,但它不能像做ON INSERT CASCADE

您需要的是歌曲表格上的一個BEFORE INSERT觸發器,如果​​需要,它將填充引用的表格。

+0

那麼如何添加觸發器?我用MySQL Workbench創建了模型,直接將它導入到mysql服務器。或者我應該將查詢分解爲單獨的表格嗎?謝謝! – user1781482

+0

您需要從MySQL文檔中研究觸發器,這很容易,只需考慮爲每個新行調用的存儲過程即可。如果你可以分解你的查詢,這也可以完成一些工作,但是你會遇到併發問題:想想兩個腳本可以同時插入同一個新的藝術家。 –

+1

如何在歌曲表中插入值時,如何在藝術家表格中首先添加藝術家名稱的觸發器? – user1781482