1

私は2つのテーブルを持っています:

CREATE TABLE `data_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` longtext NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  `data_item_type` varchar(255) NOT NULL,
  `data_source_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_AFA125D21A935C57` (`data_source_id`),
  CONSTRAINT `FK_AFA125D21A935C57` FOREIGN KEY (`data_source_id`) REFERENCES `data_sources` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7192 DEFAULT CHARSET=utf8;

CREATE TABLE `map_locations` (
  `id` int(11) NOT NULL,
  `latitude` decimal(9,6) DEFAULT NULL,
  `longitude` decimal(9,6) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `status` varchar(255) NOT NULL,
  `message_codes` longtext NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_B28E0DE7BF396750` FOREIGN KEY (`id`) REFERENCES `data_items` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

私は2段階のプロセスを達成しようとしています。最初のクエリは正常に機能します。

INSERT INTO data_items (`data`, created, updated, data_item_type, data_source_id) SELECT data_items.data, now(), now(), data_items.data_item_type, 2
    FROM data_items
    WHERE data_items.data_source_id = 1

--> 1 と 2 は値の例です

ここで、「data_items」(作成されたばかりの auto-inc) からすべての ID を取得し、「map_locations」テーブルに新しい (対応する行) を挿入するときにそれらの ID を使用したいと考えています。

そう、

data_items
id | data_source_id
1 | 1
2 | 1
3 | 2
4 | 2

map_locations
id | content
1 | aaa
2 | bbb
.... 
3 | aaa
4 | bbb

行 (1, 2) をコピーし、data_items (3,4) の ID を使用して、それらの行を挿入する必要があります。

これが理にかなっていることを願っています..かなり混乱しています。ティア。

4

1 に答える 1

1
  1. data_items元の対応するものを参照するには、新しく作成された が必要です。これを行う最も簡単な方法は、テーブルに自己参照外部キーが含まれるようにスキーマを変更することです。

    ALTER TABLE data_items
      ADD COLUMN underlying_id INT(11) NULL,
      ADD FOREIGN KEY (underlying_id) REFERENCES data_items (id)
    
  2. thenへの挿入は次のdata_itemsようになります。

    INSERT INTO data_items
      (underlying_id, data, created, updated, data_item_type, data_source_id)
    SELECT id, data, NOW(), NOW(), data_item_type, 2
    FROM   data_items
    WHERE  data_source_id = 1
    
  3. 自己結合を実行して、新しく作成されたidsを取得できるようになりました。

    INSERT INTO map_locations
      (id, content)
    SELECT new.id, map_locations.content
    FROM   map_locations
      JOIN data_items old USING (id)
      JOIN data_items new ON new.underlying_id = old.id
    WHERE  old.data_source_id = 1
    

    (デフォルトの) トランザクション分離レベルを使用して、前の挿入と同じトランザクション内でこのクエリを実行REPEATABLE READし、テーブルへの同時変更がdata_items矛盾した状態にならないようにしてください。

  4. 繰り返しますが、同じトランザクション内で、underlying_id参照をクリアします。

    UPDATE data_items SET underlying_id = NULL
    
于 2013-01-16T17:40:18.620 に答える