我将照片作为添加到照片库
CREATE TABLE galleries
(
gallery_id int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (gallery_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci
CREATE TABLE gallary_map
(
gallery_id int(11) unsigned NOT NULL,
image_id int(11) unsigned NOT NULL,
FOREIGN KEY(gallery_id) REFERENCES galleries(gallery_id) ON DELETE CASCADE,
FOREIGN KEY(image_id) REFERENCES images(image_id) ON DELETE CASCADE,
PRIMARY KEY (gallery_id,image_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci
如何避免创建重复的图库(在gallary_map中使用同一组照片)?
当然,由于galleries
条目应该在将照片添加到地图之前创建,我的意思是控制整个收藏以避免出现重复的图库。
防止这种情况并不可行,也不可取,因为重复可能是暂时的。
假设您创建了一个包含图像1和2的库。然后,您需要制作第二个包含图像1、2和3的图库。在第二个图库中添加3之间,它将是第一个图库的副本,您将被阻止。在创建第二个图库时,您必须以不同的顺序添加它们以避免这种情况。
但即便如此也不可能。假设你有3个画廊:
- 图库1=图像1和2
- Gallery 2=图像1和3
- Gallery 3=图像2和3
现在,无论您使用何种订单,都无法创建
- 图库4=图像1、2和3
前两个图像中的任何一个都将是其他画廊之一的副本。
虽然MySQL有事务来对查询进行分组,但没有将约束检查延迟到事务结束的机制。
如果您有一个同时创建库的过程,可以先执行查询,检查它是否与另一个库完全重复。例如
SELECT SUM(image_id IN (1, 2, 3)) = 3 AND COUNT(*) = 3 AS is_duplicate
FROM gallery_map
GROUP BY gallery_id
HAVING is_duplicate = 1
如果这返回一行,则表明您已经有了一个正好包含这些图像的库,您可以向用户报告问题。
如果你想找到已经存在的重复,你可以使用:
SELECT a.gallery_id, b.gallery_id
FROM (SELECT gallery_id, GROUP_CONCAT(image_id ORDER BY image_id) AS images
FROM gallery_map
GROUP BY gallery_id) AS a
JOIN (SELECT gallery_id, GROUP_CONCAT(image_id ORDER BY image_id) AS images
FROM gallery_map
GROUP BY gallery_id) AS b ON a.gallery_id < b.gallery_id AND a.images = b.images
不会有任何重复但冗余的数据
此外,如果您想将冗余数据筛选为不同的列,请使用分组和聚合记录来获得不同的库记录。
您可以在插入时操作记录,就好像(其他库)中不存在图像一样,然后插入或在插入时使用触发器。有点像下面的示例,如果插入时的新图像在任何库中都不存在,则插入。
Create Trigger Name Before Insert
On table for each row as
If(Select gallery from table where
imageid =new.imageid)
then
Else
Insert into......
End IF
End