1

電話番号データベースがあります。このデータベースには「main_number」という列があり、メイン番号ではない場合は 0、メイン番号の場合は 1 を使用する tinyint(1) タイプです。

私が抱えている問題は、ストアド プロシージャを使用して、あるデータベースから別のデータベースに一括挿入することです。

ビジネス ルールでは、代表電話番号としてマークできる電話番号は 1 つだけであると規定されています。ここで、「main_number」とマークされたレコードが既に存在するかどうかを確認する必要があります。その場合、「main_number」の値は 0 にする必要があります。しかし、レコードが見つからない場合は、main_number = 1 にする必要があります。

以下は私のテーブルの防御です

CREATE TABLE `contact_numbers` (
 `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `account_id` int(10) unsigned DEFAULT NULL,
 `person_id` int(11) DEFAULT NULL,
 `contact_number` char(15) NOT NULL,
 `contact_extension` char(10) DEFAULT NULL,
 `contact_type` enum('Office','Fax','Reception','Direct','Cell','Toll Free','Home') NOT NULL DEFAULT 'Office',
 `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',
 `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active',
 `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',
 `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `created_by` int(11) NOT NULL,
 `modified_on` datetime DEFAULT NULL,
 `modified_by` int(11) NOT NULL DEFAULT '0',
 `external_id1` char(18) DEFAULT NULL COMMENT 'client''s account id',
 `external_id2` char(18) DEFAULT NULL COMMENT 'client''s person id',
 PRIMARY KEY (`number_id`),
 UNIQUE KEY `external_id1` (`external_id1`),
 UNIQUE KEY `external_id2` (`external_id2`),
 UNIQUE KEY `person_id_2` (`person_id`,`contact_type`),
 UNIQUE KEY `person_id_3` (`person_id`,`contact_number`,`contact_extension`),
 UNIQUE KEY `account_id_4` (`account_id`,`contact_number`,`contact_extension`),
 KEY `account_id` (`account_id`),
 KEY `person_id` (`person_id`),
 KEY `account_id_2` (`account_id`,`contact_link`,`main_number`),
 CONSTRAINT `cn_account_id` FOREIGN KEY (`account_id`) REFERENCES `accounts` (`account_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `cn_person_id` FOREIGN KEY (`person_id`) REFERENCES `contact_personal` (`person_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=114851 DEFAULT CHARSET=utf8

これは私のクエリで、account_id が main_number = 1 のレコードが存在するかどうかを確認するチェックを追加する必要があります。

SELECT ac.account_id, a.phone, 'Office', 'Account', 1 AS created_by
FROM rdi_ge_dev.account AS a
INNER JOIN finaltesting.accounts AS ac ON ac.external_id1 = a.SFDC_account_id

注: 新しい一意のインデックスを追加したくありません。また、重複したキーの更新を使用したくありません。

4

2 に答える 2

2

LEFT JOINテーブルに対してa を実行し、その結果を制限しcontact_numbersた後に a を探すことにより、リスト内のa を使用してそれに応じて 1 または 0 を割り当てることができます。NULLmain_number = 1CASESELECT

SELECT
  ac.account_id,
  a.phone,
  'Office',
  'Account',
  1 AS created_by,
  /* A null in the LEFT JOIN means it doesn't already exist */
  CASE WHEN cn.number_id IS NULL THEN 1 ELSE 0 END AS main_number
FROM
  rdi_ge_dev.account AS a
  INNER JOIN finaltesting.accounts AS ac ON ac.external_id1 = a.SFDC_account_id
  LEFT JOIN contact_numbers AS cn ON a.account_id = cn.account_id
WHERE 
  /* Limit the left join to only main_number = 1 */
  cn.main_number = 1
于 2013-10-07T16:06:45.787 に答える