Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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_Copy_Duplicates - Fatal编程技术网

Mysql 如何将记录复制到表中,但如果记录已经存在则不复制

Mysql 如何将记录复制到表中,但如果记录已经存在则不复制,mysql,copy,duplicates,Mysql,Copy,Duplicates,我有3个表用作培训文档的归档机制,一个是文档表a30,一个是培训手册表,用于存储不同培训手册a36trnman的标题和id,另一个是用于存储与不同手册a31关联的文档id的表 在我的应用程序中,我允许用户复制培训手册及其相关文档,并使其成为自己的。然而,我遇到了一个问题,因为不同的培训手册可能包含相同的文档,然后在他们的培训手册中会有该文档的副本,他们可能已经修改过,并希望保留该副本。因此,我需要一个重复的培训手册查询,检查正在复制的手册中的文档是否已经存在,如果已经存在,则保留该文档,并在表a

我有3个表用作培训文档的归档机制,一个是文档表a30,一个是培训手册表,用于存储不同培训手册a36trnman的标题和id,另一个是用于存储与不同手册a31关联的文档id的表

在我的应用程序中,我允许用户复制培训手册及其相关文档,并使其成为自己的。然而,我遇到了一个问题,因为不同的培训手册可能包含相同的文档,然后在他们的培训手册中会有该文档的副本,他们可能已经修改过,并希望保留该副本。因此,我需要一个重复的培训手册查询,检查正在复制的手册中的文档是否已经存在,如果已经存在,则保留该文档,并在表a31中创建一条新记录,将现有的旧文档与刚刚添加的培训手册相关联

我的文件

CREATE TABLE `a30` (
  `docname` varchar(250) NOT NULL,
  `docfile` varchar(300) NOT NULL,
  `docfilepdf` varchar(300) NOT NULL,
  `ctgry` int(8) unsigned zerofill NOT NULL,
  `subctgry` int(8) unsigned zerofill NOT NULL,
  `id` int(8) unsigned zerofill NOT NULL auto_increment,
  `creator` int(8) unsigned zerofill NOT NULL,
  `smmry` varchar(60) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='haha!! training materials!' AUTO_INCREMENT=17 ;


CREATE TABLE `a31` (
  `pntryid` int(8) unsigned zerofill NOT NULL auto_increment,
  `pdocid` int(8) unsigned zerofill NOT NULL,
  `trnmannum` int(8) unsigned zerofill NOT NULL,
  PRIMARY KEY  (`pntryid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='document pantry' AUTO_INCREMENT=43 ;


CREATE TABLE `a36trnman` (
  `unik` int(8) NOT NULL auto_increment,
  `user` int(8) NOT NULL,
  `ctgryname` char(60) NOT NULL,
  PRIMARY KEY  (`unik`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=88 ;
我当前的查询是哪一个1。复印培训手册,2。存储培训手册id 3。然后将相关文档id的列表复制到表a31、4中。将文件复制到表a30中。如何对a30中现有的重复项进行查询检查并保留它们,但仍要参照新的培训手册向a31添加条目

SET @userid =  <code type="user" />;

CREATE TEMPORARY TABLE `a1t` ENGINE=MEMORY SELECT * FROM `a36trnman` WHERE `unik` =  '<input     name="unik" hidden="y" />';
  UPDATE a1t SET `unik` = NULL;
  INSERT INTO `a36trnman` (SELECT * FROM `a1t`);
  DROP TABLE `a1t`;
SET @lastid := LAST_INSERT_ID();

CREATE TEMPORARY TABLE `a1t` ENGINE=MEMORY SELECT * FROM `a31` WHERE `trnmannum` =  '<input     name="unik" hidden="y" />';
  UPDATE a1t SET `pntryid` = NULL, `trnmannum` = @lastid;
  INSERT INTO `a31` (SELECT * FROM `a1t`);
  DROP TABLE `a1t`;

CREATE TEMPORARY TABLE `a30t` ENGINE=MyISAM SELECT docname, docfile, docfilepdf, ctgry, subctgry, id, creator, smmry FROM `a30` LEFT JOIN `a31` ON a30.id = a31.pdocid WHERE `trnmannum` = @lastid;
  UPDATE a30t SET `id` = null, `creator` = @userid;
  INSERT INTO `a30` (SELECT * FROM `a30t`);
  DROP TABLE `a30t`;

不要认为您可以使用当前的模式

理想的方法是向documents表中添加另一列,并用唯一ID填充它。 然后将“文档链接”表更改为使用该表,而不是使用auto inc id

然后,您可以根据新的标识符插入那些不在其中的文档,因为它永远不会更改,而自动增量id必须在其中

links表的工作方式与您使用新的不可变键的工作方式相同


因此,Baicaly文档将有两个唯一标识符,一个是auto inc,另一个是mysql的等效guid。

在我的文档表中有一个唯一的id,它是a30.id列。如果它是唯一的,为什么要将其设置为null并在复制时重新生成?我是说你需要一个在所有副本中都是唯一的标识符。您正在获取重复项,因为一个文档fredblog在一个位置的id为1,在另一个位置的id为2。它是重复的,但它的id不是。明白了。我会玩的!