首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将记录复制到表中,但如果记录已在表中,则不复制

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

Stack Overflow用户
提问于 2012-06-09 06:58:42
回答 1查看 130关注 0票数 0

我有三个表作为培训文档的归档机制,一个文档表(a30),一个培训手册表(a36trnman),一个存储不同培训手册(a31)的标题和id的表,以及一个存储与不同手册关联的文档id的表。

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

我的文档

代码语言:javascript
运行
复制
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添加条目?

代码语言:javascript
运行
复制
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`;
EN

回答 1

Stack Overflow用户

发布于 2012-06-09 08:40:37

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

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

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

links表将像使用新的不可变键一样工作。

所以基本上文档应该有两个唯一的标识符,一个是auto inc,另一个是mysql的guid。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10956937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档