2017-10-09 8 views
1

これは愚かな疑問かもしれませんが、なぜ私が結果を得ているのか理解していますが、mySQLは異なる方法で動作していました。そうでなければ教えてください。MySQL - 一部のデータをあるテーブルから別のテーブルにコピーする

次のように私は2つの基本的なテーブルを持っている:

CREATE TABLE test (num INT, time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);

CREATE TABLE test_to_copy (num INT);

私はその後、test_to_copyテーブルへの単一のエントリを作成: INSERT INTO test_to_copy VALUES (12);

を今、私はテーブルを試してみて、コピーtest_to_copyをテストします。 INSERT INTO test SELECT * FROM test_to_copy;

投げ続ける3210

エラーが

「列カウントは1行で値の数と一致しません」です。

私は、両方のテーブルの列の数が意味を持たないことがわかっていますが、私たちのコピーを割り当てる変数はわかりませんが、時間が作成されるケースではないはずです。エラーをスローするのではなく、コピーを実行するときに何も挿入されなければ自動的にデフォルトになりますか?

制約のために、私はもはや両方のテーブルで時間を持つことができません。また、50個以上のカラムがあるので、test_to_copyテーブルでSELECT *を実行する必要があります。これについては簡単な方法がありますか?

答えて

1

これは頻繁に質問の別の変形例である:「私は*-except-for-one-columnを問い合わせることができますか?」

いいえ、SQLにはワイルドカード付きの例外構文はありません。 *ワイルドカードはすべての列を意味します。すべての列を必要としない場合は、明示的に列に名前を付ける必要があります。

この方法が複数のテーブルで使用される可能性があるため、さまざまな列がある場合は、任意のテーブルの列の一覧をINFORMATION_SCHEMA.COLUMNSから取得し、その情報を使用して動的SQLクエリを作成できます。また

SELECT 
    GROUP_CONCAT(
     CONCAT('`', column_name, '`') 
) AS _cols 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable' 
    AND COLUMN_NAME NOT IN ('time'); -- or other columns to exclude 

を参照してください:私は "test_to_copy SELECT * FROM" する必要が

0
INSERT INTO test (num) 
SELECT num 
FROM test_to_copy 
+0

ここ

あなたは列のリストを生成することができます方法です複数のメソッドが個別のメソッドfを作成するのではなく、この実装を使用するためまたは各クエリ。 –

+0

上記のクエリで、「SELECT * FROM test_to_copy」を使用することもできます。 –

関連する問題