別のDBから複数行のINSERT

このQ&Aのポイント
  • 別のDBのテーブルからデータをINSERTする際にエラーが表示される場合、SQL文の書き方を確認しましょう。
  • エラーメッセージ「Operand should contain 1 column(s)」は、INSERT文のカラム数が正しくないことを示しています。
  • INSERT文に複数の値を指定する場合、VALUES句ではなくSELECT句を使用してください。
回答を見る
  • ベストアンサー

別のDB(Table)からの複数行のINSERT

Wordpressにあるusermetaというテーブルに、 別のDBのテーブルからデータをINSERTしたいのですが、 #1241 - Operand should contain 1 column(s) というエラーが表示されてうまくいきませんでした。 具体的なSQL文は、 insert into ***_usermeta (umeta_id,user_id,meta_key,meta_value) select (null,tableBid,'first_name',''), (null,tableBid,'last_name',''), (null,tableBid,'nickname',tableBname), (null,tableBid,'***_capabilities','a:1:{s:10:\"subscriber\";b:1;}'), (null,tableBid,'***_user_level','0') from dbB.tableB where tableBname<> 'Admin' dbBのtableB にあるAdmin行以外を対象としています。 実際にはもう少しデータが多いのですが、select (null,uid,'first_name','') from ・・・ だけにしても同じエラーが出ましたので、構文の書き方が間違っていると感じています。 (別のDBではなく、同じDBの別のTableからのINSERTでも同じエラーが表示されました) 上記のようなケースの場合、どのようにSQL文を書けばよいのでしょうか? お分かりになられる方がいらっしゃいましたら、ご教示頂けますと幸いです。 宜しくお願い致します。

  • MySQL
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

1.select文の カラムリストに () 付けで、複数行データ定義などと言うことはできません。 union all を使ってください。 2.まずは、select 文だけ書いてみてエラーのない select 文になれば、insert につないで実行可能です。 No1回答への補足をみると 1対1対応させるのは、できてるのですね。 3. umeta_idカラムが auto_increment だからnull を入れているなら、カラムリストから外しても良いと思います insert into ***_usermeta (user_id,meta_key,meta_value) select tableBid,'***_user_level','0' from dbB.tableB where tableBname <> 'Admin' union all select tableBid,'nickname',tableBname from dbB.tableB where tableBname <> 'Admin' 4. dbB.tableB の一行に対して、5行(以上)作って順番指定したいのですね。 5行用のデータを union all で繋いで作ったtableを join しましょう。 select b.tableBid as user_id, k.meta_k as meta_key, COALESCE( k.meta_v , b.tableBname ) as meta_value from ( select tableBid, tableBname from dbB.tableB where tableBname <> 'Admin' ) as b cross join ( select 'first_name' as meta_k, '' as meta_v , 1 as order_no union all select 'last_name', '' , 2 union all select 'nickname', null, 3 union all select '***_capabilities','a:1:{s:10:\"subscriber\";b:1;}' , 4 union all select '***_user_level','0' , 5 ) as k order by b.tableBid, k.order_no ; 上記のtable記述順でcross join するなら、order by は無くても、希望の順番にはなりそうですけど、一応いれておきました。 このselect文で、insert したい行が生成できているならば、あとは先頭にinsert 用の構文(3で提示の1行目)を繋げばよいでしょう。

kinmugi
質問者

お礼

ご回答有難うございます。 具体的な構文をご教示頂いて助かりました。 結果的に、4の方法だと #1054 - Unknown column 'tableBname' in 'field list' といったエラーが表示されたり、うまく接続?出来なかった感じなので、 3の方法を使用させていただきました。 最後に order by tableBid を付記することで、user_id順にうまく登録されました。 selectは()ダメなんですね、勉強不足で申し訳ございません。 values()のようにいけるのかと思い込んでいました・・・ ちょうど海外のサイトで同じエラーのスレッドがあったので、そこでunion allを見つけたのですが、詳しい使用方法を教えて頂いてありがとうございました! おかげで様で無事INSERTすることが出来ました。 また4の方法も勉強して、次回うまくいけるようにしてみたいです。 ありがとうございました。

その他の回答 (2)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

Insert文のumeta_idを書くのをやめて、Select文にorder by user_idを追加

kinmugi
質問者

お礼

ありがとうございます。 order by user_id 、勉強になりました!

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Insert する列数とselect する列数は一致してないとダメでしょう。 Selectした列にエイリアスが無いから、列の並びと属性も一致してることが必要。 > from dbB.tableB where tableBname<> 'Admin' from dbB.tableB where tableB.name<> 'Admin' Where条件の左辺、正しい?Whereを除外して動作するなら テーブル名の修飾、列名の存在等を確認。

kinmugi
質問者

補足

ご回答頂きましてありがとうございます。 エイリアスは省略してしまいましたが、付加しても無くても同じ結果でした。 補足となりますが、以下のSQL文だと問題なくINSERTされます。 insert into ***_usermeta (umeta_id,user_id,meta_key,meta_value) select null,tableB.id,'first_name',''from dbB.tableB where tableB.name<> 'Admin' これを以下のように複数行書けば恐らくINSERTできると思うのですが、 insert into ***_usermeta (umeta_id,user_id,meta_key,meta_value) select null,tableB.id,'first_name',''from dbB.tableB where tableB.name<> 'Admin'; insert into ***_usermeta (umeta_id,user_id,meta_key,meta_value) select null,tableB.id,'nickname',tableB.name from dbB.tableB where tableB.name<> 'Admin'; ・・・ 希望としては、一度のSQLで実行を行おうと思っており、 selectの後に()で括っているのですが、どうもそれの書き方?が間違っているのか #1241 - Operand should contain 1 column(s) のエラーが表示されます。 meta_keyとmeta_valueの組み合わせが複数あり、 umeta_idはAUTO_INCREMENTなので、できればuser_idの順番どおり全てINSERTしたいと思っております。 umeta_id | user_id | meta_key | meta_value 1 | 1 | first_name| 2 | 1 | last_name | 3 | 1 | nickname | nicknameA 4 | 1 | ***_capabilities | a:1:{s:10:"subscriber";b:1;} 5 | 2 | first_name| 6 | 2 | last_name | 7 | 2 | nickname | nicknameB 8 | 2 | ***_capabilities | a:1:{s:10:"subscriber";b:1;} ・・・といった感じです。 実現が難しそうなら、select文を一行ずつ実行してみようかと考えています。

関連するQ&A

  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • [PostgreSQL]別DBのテーブルのSelect、Insert

    お世話になっております PostgreSQL8.1を使用しまして あるテーブルにInsertがかかると その内容を判断し別のテーブルに insertをする仕組みが必要になり いろいろ試してみて TriggerとFunctionを使用すれば 実装できるとこまでわかりました。 ただしその別テーブルが別DBに配置されているので そのテーブルに以下のようなInsert文を発行しても エラーになってしまいます。 Insert into SUB_DB.TEST_TBL values('test','date'・・・・); (SUB_DB:ストアドを実行しているのとは別のDB) ストアドから別テーブルを参照更新する手段を ご存知のかたご教授いただけますでしょうか。 よろしくお願いいたします。

  • md5で暗号化して別フィールドにinsertしたい

    このようなMySQLのtable1があります。 id , name , comment   , ango 1 aoki こんにちは   null 2 inoue おはよう null 3 ueno こんばんは null 4 ono こんにちは null idはprimaryでauto_incrementです。 commentデータをmd5で暗号化して、angoのフィールドに入力したいのですが、うまくいきません。 select comment, md5(comment) from table1 を実行したところ、全てのcommentデータが暗号化されたのですが、それをangoフィールドにinsertしようとするとエラーが発生します。 insert into table1 (ango) select comment, md5(comment) from table1 #1066 - Not unique table/alias: 'table1' 検索してみたら同じ状況の方がいました。私もMySQLは3.23.58を利用しているのでそれが原因のようです。 http://www.mysql.gr.jp/mysqlml/mysql/msg/10401 MySQLのバージョンを上げることなく、どのような手順でやれば可能でしょうか?

    • ベストアンサー
    • MySQL
  • Insert文で・・・

    失礼します。SQL初心者なので質問します。 Insert into Aテーブル Select X , Y , Z From Bテーブル というSQLがあり、Aテーブルの列数を3から4にした際、AテーブルへのInsertの項目を、BテーブルからSelectされたX,Y,Z以外に普通の変数αも新たに作成した4つめの項目として同時にInsertしたい場合、どのようなSQLにすれば良いでしょうか? Insert into Aテーブル (Select X , Y , Z From Bテーブル),α みたいに都合良くはいきませんよね??

  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP
  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • insertでのエラーについて

    お世話になります。 アップロードしたバイナリデータを変数に入れて、それをinsertしているのですが、DBに入りません。 テーブルでは、data mediumblob not nullと設定しています。Perlスクリプト内で、次のように書いています。 $sql="insert into data_tbl(data)"; $sql.="values('" . $datafile . "')"; 上記の$datafileにバイナリデータが入っています。 このようにして実行しているのですが、You have an error in your SQL syntax. とエラーになりDBに格納できません。ご教授よろしくお願いします。

  • レコードセットの値を一気にDBに

    access2007で開発しています。 レコードセットのデータをDBのテーブルに一気にいれる方法はないのでしょうか? 調べたところレコードセットをMOVENEXTで一件ずつ読込み、インサート文をなげている例はあったのですが、一気にいれる方法は見当たりませんでした。 さらにいうと元々はSQLで insert into テーブル1(・・・) select ・・・from テーブル2 としたかったのですが、executeすると´3065´選択クエリを実行できません´のエラーとなってしまいました。 すいませんが、ご教唆ねがいます。