我有3个表用作培训文件的归档机制,文件表(a30),培训手册表(用于存储不同培训手册的标题和ID)(a36trnman)以及用于存储文档ID的表与不同手册相关的文档(a31)。
在我的应用程序中,我允许用户复制培训手册及其相关文档,并使其成为自己的文档。但是,我遇到了一个问题,因为不同的培训手册可能包含相同的文档,然后在他们的培训手册中可能会重复存在该文档(它们可能已被修改,并希望保留)。因此,我需要一个重复的培训手册查询,以检查该用户是否已经存在要复制的手册中的文档,如果存在,则将其保留在原处,并在表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`;
最佳答案
不要认为您可以使用当前架构
理想的方法是在文档表中添加另一列,并用唯一标识填充它。
然后更改您的文档链接表以使用该表代替自动公司ID。
然后,您可以根据新标识符仅插入那些尚未在其中的文档,因为它永远不会改变,因为您的自动增量ID必须在此位置。
链接表可以正常工作,就像您使用新的不可变键一样。
因此,基本的文档将有两个唯一的标识符,一个是auto inc,另一个是mysql相当于guid的标识符。