gpt4 book ai didi

mysql - 如何将记录复制到表中,但如果它们已经存在则不复制

转载 作者:行者123 更新时间:2023-11-29 14:25:57 25 4
gpt4 key购买 nike

我有 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`;

最佳答案

不认为您可以使用当前架构

理想的方法是向文档表添加另一列并用 uniqueid 填充它。然后更改文档链接表以使用它而不是自动 inc id。

然后您可以根据新标识符插入那些尚未存在的文档,因为它永远不会改变,而您的自动增量 ID 必须改变。

链接表将像您使用新的不可变 key 一样工作。

因此,基本文档将有两个唯一标识符,一个是 auto inc,另一个是 mysql 的 guid 等价物。

关于mysql - 如何将记录复制到表中,但如果它们已经存在则不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com