Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中的唯一条目_Mysql_Sql_Database Design - Fatal编程技术网

mysql中的唯一条目

mysql中的唯一条目,mysql,sql,database-design,Mysql,Sql,Database Design,我将照片添加到照片库中,如下所示: 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 N

我将照片添加到照片库中,如下所示:

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中创建具有相同照片集的重复画廊


当然,由于图库条目应该在将照片添加到地图之前创建,我的意思是控制整个收藏以避免出现重复的图库。

除了冗余数据之外,不会有任何重复

此外,如果要将冗余数据作为不同的列进行筛选,请使用group by和AGGRAGE记录来获取不同的库记录

不过,在插入时,您可以像在其他库中不存在图像一样操作记录,然后插入或在插入时使用触发器。有点像下面的示例,如果插入时的新图像不存在于任何库中,则插入

   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

防止这种情况并不切实可行,也不可取,因为复制可能是暂时的

假设您创建了一个包含图像1和2的库。然后,您需要创建第二个包含图像1、2和3的图库。在将3添加到第二个库之间,它将是第一个库的副本,您将被阻止。创建第二个库时,您必须以不同的顺序添加它们,以避免出现这种情况

但即使这样也不可能。假设您有3个图库:

画廊1=图片1和2 画廊2=图片1和3 画廊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

是什么或谁强迫您创建副本?你是在问你的前端行为吗?你所说的复制库是什么意思?数据不是冗余的duplicate@PM77-1最终用户应该如何知道某个图库存在一组特定的照片,而不是创建它?@HimanshuAhuja我们可能有100个图库,其中只包含图像59和77,例如,这不是一个数据库问题,而是您的编程逻辑。例如,您可以在图像表中存储图库id以强制执行1对1关系。假设每个图库都是一个显示其照片的网页。然后,根据谷歌的说法,我可能会有数百万个重复页面。我无法分组,因为每个页面都是通过先查找gallery_id创建的。然后,您需要更改表格结构设计,再添加一列,使设计至少保持不变relevant@Googlebot:您所说的是表示层。1。如果在一次查询中插入所有条目到gallery_map中会发生什么情况?2.如何检查同一集合是否已存在?或3。画廊最终确定后,如何查找和删除重复条目?1。没有任何东西只在查询结束时检查约束。2.我已经回答了。我添加了一个查询来查找答案的重复项。