2012-06-08 51 views
0

我有3個表格用作培訓文檔,文檔表格(a30),培訓手冊表格的歸檔機制,該表格存儲標題和ID不同的培訓手冊(a36trnman)以及用於存儲與不同手冊(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.然後複製列表到表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`; 

回答

1

不要以爲你可以與你當前架構

理想的方式將另一列添加到文件表,並用UNIQUEID填充它。 然後改變你的文檔鏈接表來使用它來代替auto inc id。

然後,您可以只根據新標識符插入那些還沒有在那裏的文檔,因爲它永遠不會改變,因爲您的自動增量ID必須。

鏈接表就像你使用新的不可變鍵一樣工作。

如此卑鄙的文檔將有兩個唯一的標識符,一個是auto的inc,一個是mysql的guid等價物。

+0

在我的文檔表中有一個唯一的id,它的'a30.id'列。 – Nat

+0

如果它是唯一的,那麼爲什麼在複製時將它設置爲null並重新生成?我說你需要一個在所有「副本」中唯一的標識符。您正在創建重複項目因爲「FredBlogg」文檔在一個地方的ID爲1,另一個地方的ID爲2。它是重複的,但它的ID不是。 –

+0

gotcha。我會玩這個! – Nat

相關問題