簡體   English   中英

如果連接的表上不存在mysql插入

[英]mysql insert if not exists on joined tables

我的表如下所示:

表“帖子”

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'

因此,我需要一個查詢來檢查“標簽”中是否已經存在tag1 / tag2 / tag3,否則將其插入,然后將其作為外鍵+“文本”插入“ 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'));

使用該功能,僅當標簽尚不存在時才插入“標簽”,並返回現有或新創建的標簽的ID。 Yipeee :)

您必須先插入帖子,然后再插入標簽。 SQL中沒有多表插入解決方案。

您甚至不能在標簽的觸發器上將帖子文本插入到帖子中,因為插入標簽的標簽只能包含屬於標簽的列。

如果需要避免標記表中的重復項,則可以使用INSERT IGNORE或REPLACE或INSERT ... ON DUPLICATE KEY UPDATE。 有關更多詳細信息,請參見我對“ INSERT IGNORE”和“ INSERT ... ON DUPLICATE KEY UPDATE”的回答。


重新發表您的評論。

僅當讓自動遞增機制生成新的id時,您才能獲取生成的PK。 如果讓自動增量發生,則可以保證不會導致重復的PK。

如果您指定一個ID並繞過自動遞增,則無論如何都無法獲得該ID。 但是,如果您在INSERT中指定了該值,則無需查詢它-您應該已經擁有它。

唯一的其他情況是,如果您具有不自動遞增的輔助唯一密鑰。

CREATE TABLE foo (id int auto_increment primary key, name varchar(10), unique key (name));
INSERT INTO foo (name) VALUES ('bill');
SELECT LAST_INSERT_ID(); -- returns 1
INSERT INTO foo (name) VALUES ('bill');
SELECT LAST_INSERT_ID(); -- returns 1

這有點令人困惑,因為最后一個插入ID來自成功並生成一個ID的最后一個INSERT。


使用INSERT INTO posts (text,tag1,tag2,tag3)重新更新。 這就是重復組 如果需要四個標簽怎么辦? 如果帖子只有兩個標簽怎么辦? 如何對帶有給定標簽的帖子進行索引搜索?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM