1

約 1400 レコードのメンバーを持つ mysql テーブルがあり、新しいメンバーシップ ソフトウェア (amember v3 から amemberv4) に切り替える予定です。問題は、amember v4 がまったく新しいプログラムであるため、データベース テーブルに欠落レコードが存在しないか、主キーに基づいて並べ替えられることです。たとえば、製品テーブルの製品 ID に関連付けられているメンバー テーブルのメンバーシップ ID。このディメンションを参照するファクト テーブルがあります。

私の問題は、行方不明の開始メンバーシップ ID を持つ null レコードを追加する方法です。たとえば、テーブルはメンバーシップ ID 1、2、3 ではなく 4 で始まります。不足しているメンバーシップ ID に基づいて、これらの不足しているレコードを追加する解決策を見つける手助けが必要です。最初のテーブル (membersold、members) に基づいて 2 番目のテーブルを作成しました。欠落しているレコードを追加する更新ステートメントを作成するには、それらを互いに結合する必要があると確信しているためです。null 値になる列が約 7 列あります。

何か案は?

4

1 に答える 1

0

まず第一に、ヤン・ドヴォルザークとマイケル・ベルコウスキーの両方が言ったことは絶対に真実です。したがって、このハックが本当に必要かどうを注意深く確認してください。

しかし念のため、これはすべての ID をテーブルに挿入します - ID が主キーであり、まだ存在していない場合に限ります。

他のほとんどの方法の方が優れていますが (手動で行う場合を除く)、MySQL または他の言語での手順が必要です。

-- insert IDs from 1 to 1701, plus another field "otherfield" with value "othervalue"
-- The maximum ID here is about 2400, but you said you needed at most 1400.
-- And you can add 1000 instead of 1 to the value of 'id' and run it again
-- to insert ids from 1000 to 2701 :-)

INSERT IGNORE INTO yourtable
      (id, otherfield)
SELECT id, 'othervalue'
FROM (
    SELECT 1+a.x+b.x*7+c.x*49+d.x*343 AS id FROM
    ( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
      SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS a
    JOIN
    ( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
      SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS b
    JOIN
    ( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
      SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS c
    JOIN
    ( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
      SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS d
   ) AS generated
WHERE generated.id < 1701;

私が言ったように、これは物事を行うための非常に醜い方法です。

利用可能な言語がある場合は、挿入クエリを生成して実行できます。たとえば、bash で実行できます。

( for id in $( seq 1 1400 ); do
    echo "INSERT IGNORE INTO mytable ( id, otherfield ) VALUES ( $id, 'hello' );"
done ) | mysql databasename

または PHP、Python、Perl では、次の形式の SQL INSERT ステートメントを生成するだけです。

INSERT IGNORE INTO mytable ( id ) VALUES ( ... );

増分カウンターで空白を埋めてから、ステートメントをデータベースに送信します。はIGNORE、すでに存在する値をスキップします。空欄を埋める方法は、選択した言語によって異なります。他のフィールドに入力する必要がある場合はid、空白の後に名前を入力し、そのデフォルト値を入力します。

于 2013-01-05T20:35:44.547 に答える