我有一個表tags2
與字段tag_id
和name
。我有一個連接表tag_map
,連接表tags2
到表video
(通過vid_id)的字段tag_id
和vid_id
。插入數據到多對多
當我插入一個新的標籤爲vid_id
,我刪除了所有條目tag_map
爲vid_id
,如果有隻有一個tag_map
爲tag_id
進入,我也刪除標籤表tags2
防止鬼項(標記沒有對應的tag_map條目的條目)。
然後,我在插入時檢查每個標記以檢查tags2
表中是否存在該標記。如果是這樣,我得到它的tag_id
,我插入tag_map
表中的條目。如果它不插入到兩個表中。 有沒有更好的方法來做到這一點?一個人提到,我應該在tags2
和tag_map
上都有外鍵,但我仍然不知道如何檢查標記是否存在於表tags2
中,因此我可以得到它的tag_id
,並將其與輸入tag_map
。
foreach($variable as $tag) {
$sql = 'SELECT *, COUNT(tags2.name) as cnt
FROM tag_map
JOIN tags2 ON tags2.tag_id = tag_map.tag_id
JOIN video ON video.vid_id = tag_map.vid_id
WHERE tags2.name=?';
$stmt_tags2 = $conn->prepare($sql);
$result=$stmt_tags2->execute(array($tag));
while ($row = $stmt_tags2->fetch(PDO::FETCH_ASSOC)) {
$cnt=$row['cnt'];
$exist_tag_id=$row['tag_id'];
}
$id=md5(uniqid());
$tag_id=md5(uniqid());
if ($cnt==0){
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$tag_id));
$sql="INSERT into tags2 (tag_id,name) VALUES (?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($tag_id,trim($tag)));
}
else {
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$exist_tag_id));
}
}
所以基本上你說我應該保持我插入的方式,但修改我的tag_map表有一個更靈活的狀態字段?一位數據庫專家說,我應該在tag_id字段中添加外鍵,但不再幫助我,所以我不確定這一點。對此有何想法?謝謝你的時間理查德。 – Scarface