0

トレーニング ドキュメントのファイリング メカニズムとして使用する 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`;
4

1 に答える 1

1

現在のスキーマでできるとは思わない

理想的な方法は、ドキュメント テーブルに別の列を追加し、uniqueid を入力することです。次に、auto inc id の代わりにそれを使用するようにドキュメント リンク テーブルを変更します。

次に、新しい識別子に基づいて、まだ変更されていないドキュメントだけを挿入できます。これは、自動インクリメント ID が必要な場合に変更されることはありません。

リンク テーブルは、新しい不変キーを使用する場合と同じように機能します。

したがって、baically ドキュメントには 2 つの一意の識別子があり、1 つは auto inc で、もう 1 つは mysql の guid に相当します。

于 2012-06-09T00:40:37.290 に答える