我的表是這樣的:MySQL的插入,如果不存在於連接表
表「上崗」
posts.id = PK, auto-increment
posts.text = varchar
posts.tag_id 1 = int, FK to tags.id
posts.tag_id 2 = int, FK to tags.id
posts.tag_id 3 = int, FK to tags.id
表「標籤」
tags.id = PK, auto-increment
tags.tag = varchar
現在我想插入以下數據:
text: 'lorem ipsum'
tag1: 'music'
tag2: 'pop'
tag3: 'singer'
所以我需要aq uery檢查tag1/tag2/tag3是否已經存在於「tags」中,否則插入它們,然後將它們作爲外鍵+「text」插入到「posts」中的新行中。
我看了一下mysql INSERT IF NOT EXISTS,但我只是卡住了,不知道從哪裏開始。我知道我可以用多個查詢處理它,但必須有另一種更輕的方法才能達到相同的結果。
有沒有人有這方面的經驗?
更新
我的一個朋友提出這樣的:
CREATE FUNCTION getTagID(tag VARCHAR('100')) RETURNS int
INSERT INTO posts (text,tag1,tag2,tag3)
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer'));
當然getTagId的實施,至今下落不明,但是這是否合理? getTagID應該選擇帶給定標籤的id,如果它不存在,插入它並返回它。任何幫助表示讚賞。
解決方案
我創建MySQL中的自定義函數:
DELIMITER ;;
CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT
BEGIN
DECLARE tagID BIGINT;
SET tagID = (SELECT id FROM tags WHERE text = tag);
IF tagID IS NULL
THEN
INSERT INTO tags (text) VALUES (tag);
SET tagID = (SELECT LAST_INSERT_ID());
END IF;
RETURN tagID;
END;;
DELIMITER ;
,現在我可以插入帖子這樣的:
INSERT INTO posts (text,tag1,tag2,tag3)
VALUES ('lorem ipsum', getTagID('music'), getTagID('pop'), getTagID('singer'));
與功能,插入只有在標籤尚不存在時纔將其轉換爲「標籤」,並返回現有標籤或新創建的標籤的標識。 Yipeee :)
謝謝!如果我使用INSERT IGNORE,插入後是否可以獲得PK?我可以在1次交易中的下一個聲明中使用它嗎? – 2013-03-20 14:35:22
我在應用程序服務器端使用PDO/PHP – 2013-03-20 14:35:38
在上面添加了另一個想法...沒有人關心;) – 2013-03-21 11:00:17