MySQL初心者です。
以下のようなテーブルを作ろうかと考えています(PHP経由)
======================
id   filename
1    1.jpg
2    2.jpg
  ・・・
======================
要はオートインクリメントで得たidを別のカラムでも活用したいのです。

とりあえず考えたのは、

1) insert で id を書き込む
2) last_insert_id() で id を得て update で filename を書き込む・・・

といったところですが、2段階作業というのが気になります。
「一発で」できる方法があるならそうしたいのですが無理でしょうか。

「無理」という回答でも結構です。
お詳しい方、よろしくお願いいたします。

A 回答 (3件)

filenameを書き込む必要ないのでは?



SELECT concat(id,'.jpg') as filename FROM `hoge`
    • good
    • 1
この回答へのお礼

あ!
filenameカラム自体いらないってことですか。
なるほどいらないですね・・・
根本的なご指摘ありがとうございました。

お礼日時:2009/05/19 01:06

サブクエリを使うにしても、insert対象のtableをselect文の対象に出来ないので、先にデータ取得するか、後から取得か、いずれにしてもSQL文2行は必要。


いちいちfetchが要らない方法としては、変数を使う方法がある

$sql1 = "set @a = (select max(id) from `tablename`) ";
$sql2 = "insert into `tablename` set `filename`= concat( @a:=@a+1 , '.gif')";

phpの mysql_query() では、1行ずつSQL文を発行しなければならないが、続けて発行するだけですむ。
前方から順に@aに1ずつ足していくので、以下のように複数行を一度にinsertも可能。

$sql2 = "insert into `tablename` ( `filename` ) values( concat(@a:=@a+1,'.gif') )
, ( concat(@a:=@a+1,'.gif') ) , ( concat(@a:=@a+1,'.gif') )":
この場合も $sql1を発行してから、$sql2を発行する。
    • good
    • 1
この回答へのお礼

なるほどいずれにしても2行必要ですね。
ありがとうございました。

お礼日時:2009/05/19 01:04

INSERT前に、AUTO_INCREMENTでわりあてられる値を事前に調べておくとか。



参考:
http://okwave.jp/qa1727794.html
    • good
    • 0
この回答へのお礼

なかなか1発でできる方法はないですね。
ありがとうございました。

お礼日時:2009/05/19 01:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qなんて書いてますか? ADD ME TO MARVEL'S DO NOT EMAIL LIST C

なんて書いてますか?

ADD ME TO MARVEL'S DO NOT EMAIL LIST
CHANGE MY EMAIL PREFERENCES

By entering your email address below, you will be unsubscribed from all future commercial emails from Marvel

Confirm your email address:

Aベストアンサー

ADD ME TO MARVEL'S DO NOT EMAIL LIST
私をMarvelの「メールを送らないリスト」に加えて下さい。

CHANGE MY EMAIL PREFERENCES
私のメールの設定を変更して下さい。

By entering your email address below, you will be unsubscribed from all future commercial emails from Marvel
下の欄にあなたのメールアドレスを入力すると、今後Marvelからの商業メールの送付が全て解除されます。

Confirm your email address:
あなたのメールアドレスを(所定の欄に入力して)ご確認ください。

Qトランザクションとlast_insert_id

トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。

以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。

(1) トランザクション開始

(2) $sql=" INSERT INTO hoge1(name) value('あああ'); ";

(3) ( ロールバック )

(4) $key=mysql_insert_id();

(5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); ";

(6) ( ロールバック )

(7) コミット

(8) トランザクション終了

よろしくお願いします。

環境: php5,mysql5 (InnoDB)

トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。

以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。

(1) トランザクション開始

(2) $sql=" INSERT INTO hoge1(name) value('あああ'); ";

(3) ( ロールバック )

(4) $key=mysql_insert_id();

(5) $sql2=" IN...続きを読む

Aベストアンサー

トランザクション中のINSERTに対しても、LAST_INSERT_ID()関数は適切な値を返すと思いますが、状況としては、『取得できない』とは、エラーがでるのでしょうか?それとも、不適切な(予期しない)値が得られるのでしょうか?
状況をもう少し教えていただけると助かります。
(直にSQLで『SELECT LAST_INSERT_ID();』を実行して、ダメでしょうか?)

QTO DO LISTを日本語で言うと?

よくビジネスで、TO DO LISTって使いますよね。
手帳なんかにも出てきますね。

文字通り「やらなければならないことのリスト」という意味であることはわかるのですが、
そういう直訳的・説明的な訳ではない、ひとことでビシッと言い表せる定訳ってありますでしょうか?

ビジネスの現場にあまり詳しくないので、ビジネス関係の方、みなさんどんなふうに言ってらっしゃるか知りたいと思います。
よろしくお願いします。

Aベストアンサー

#1でございます。すこし補足を。


日本国内にはじめてファイロファクスの「システム手帳」が入ってきた時に、今までの日本の手帳にはないまったく新しい概念のリフィルがありました。それが「TO DO LIST」です。

やるべきことを羅列していくだけの用紙ですが、画期的だったのは「チェックマーク」を入れる部分があったことです。

完了したものにはチェックを入れて「済」ということにしておけば一目瞭然であり、チェックの入っていない項目だけを注意して見ていれば良いわけです。

こうしたTODOLISTの「忘れていることが明瞭にわかる」という機能に対して、日本語の備忘(忘れたときのための備え)という意味を重ね合わせて「備忘録」と呼んでいました。

当時のシステム手帳を使い始めた人たちが同様に感じてTODOLISTを「備忘録」と呼んでいたわけで、英訳がどうこうという話ではないのです。

QLAST_INSERT_IDで同時にアクセスが会った時

MYSQL 3.23
auto_incermentで発行されたIDを別テーブルに使いたいのです。

last_insert_id や mysql_insert_id はコネクションごとに区別されるというのは本当でしょうか?

同時に複数のinsertが実行された場合でも、同じコネクションで発行されたIDだけを取得可能でしょうか?

よろしくお願いします。

Aベストアンサー

「多くの場合、ユーザは、複数のテーブルの
一意の識別子を管理するために ROLLBACK や
LOCK TABLES を使用していた。これは、
AUTO_INCREMENT カラムおよび SQL 関数
LAST_INSERT_ID() または C API 関数
mysql_insert_id() を使用することで、
はるかに効率的に処理することができる。」
とありますので、一応は保証されていると考えて
よいのではないでしょうか。もちろん私が、保証
することはできませんので、自己責任で判断すべき
ことです。
3.23はトランザクション環境にないため、厳密に
整合性を保つためにはid管理は使用者側が任意に
行うべきだというのが個人的な感想です。

お役にたてませんで、申し訳ないです

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/ansi-diff-transactions.html

QOUTLOOKより軽いスケジューラ(TO DO LIST)

現在、OUTLOOKをスケジュール管理ソフトとして使っていますがかなり重いので他のものを探しています.
SCHEDULE WATCHER がいいときいて試してみたのですが
TO DO LISTの機能で定期的な仕事を入力する機能がないので困っています.
他にお勧めはありませんでしょうか
宜しくお願いいたします.

Aベストアンサー

私も、一時期スケジューラにはまって集めた記憶があります。
そのとき、SCHEDULE WATCHERも使用しました。
いっぱい集めたのですが、Zclock98というソフトも使用しました。
このソフトは、今Zclone98と名前を変えて配布されています。
ダウンロードして試してみてはいかがでしょうか。

(「定期的な仕事」という内容がよくわかりません。もう少し具体的に表記していただけませんか?)

参考URL:http://hp.vector.co.jp/authors/VA002242/zclone98/help_html/index.html

Q何故、mysql_insert_id が not a valid になるのでしょうか?  

MySQLバージョン サーバ5.0.45、 クライアント 3.23.49
Apache2.0.61 (Win32) PHP4.4.7 の環境下で、
名称 member, id int(10) unsigned not null auto_increment、
name, varchar(20) not null, mail varchar(30) not null のテーブルを作りました。         

次のスクリプトを書いて
<?php
session_start();
$name = $_POST["name"];
$mail = $_POST["mail"];
print_r($_POST);
$conn = mysql_pconnect("localhost", "ABC", "XYZ") or die("Can't connect");
mysql_select_db("SIMEI", $conn) or die("db error") ;
$query = "INSERT INTO member (name, mail) VALUES ('$name','$mail')";
$result = mysql_query($query, $conn);
//$oid = 'mysql_insert_id($result)'; //''で括ってみる
$oid = mysql_insert_id($result); // ← 11行
$result = mysql_query( "SELECT id FROM member WHERE oid = $oid", $conn);
if($result){ print("insert OK");}  echo "Can't insert ";
$_SESSION['id'] = mysql_result($result, 0); // ← 14行
mysql_close($conn);
?>

これを実行すると、 データはmysql DB に登録されますが、下記のエラーが出て、id を取得できません。
何故でしょうか? どうすれば不具合を解決することができるでしょうか?
Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in C:\・・・・\insert.php on line 11
Warning: mysql_result(): supplied argument is not a valid MySQL result resource in C:\・・・・・\insert.php on line 14

MySQLバージョン サーバ5.0.45、 クライアント 3.23.49
Apache2.0.61 (Win32) PHP4.4.7 の環境下で、
名称 member, id int(10) unsigned not null auto_increment、
name, varchar(20) not null, mail varchar(30) not null のテーブルを作りました。         

次のスクリプトを書いて
<?php
session_start();
$name = $_POST["name"];
$mail = $_POST["mail"];
print_r($_POST);
$conn = mysql_pconnect("localhost", "ABC", "XYZ") or die("Can't connect");
mysql_select_db("S...続きを読む

Aベストアンサー

$resultを渡すのが間違っているような。

参考URL:http://search.goo.ne.jp/web.jsp?MT=php+mysql_insert_id&STYPE=web&IE=UTF-8&from=gootop

Qto.do.に関して

I have not choise but to do so.
のto do so.が何故to do soなのかわかりません。
to do so.には何の意味があるのでしょうか?
to.do.に対して理解できてません。

Aベストアンサー

前に書いているはずです。
まず、古いイギリス英語なら have not もありますが、
普通は I don't have any choice ~か、I have no choice です。

I have no choice but to do so. で「そうするより仕方がない」

「そうする」とは何かは前に書いているはずです。
これだけの例文なら、そういう前提での文と考えるしかありません。

QUsage: \. | source とはどういうことですか。

C:直下に mysql フォルダ を置き、そのmysql フォルダの直下に test.sql を置きました。
test.sql の中味は、
create table shohin(・・・・・・・・);
insert into shohin(a,b,) values(pqr,xyz);
・・・・・・
と書いています。

この準備により、databese[zaiko] の [shohin]テーブルに、一括してデータを書き込みたいと思って、
mysql> use zaiko
Database changed
mysql> \.test.sql とすると、

Error:
Usage: \.<filename> | source<filename>
というエラーが出ます。

mysql> mysql zaiko <\.test.sql
としても同じエラーです。

Usage: \.<filename> | source<filename> とは、どういう意味のことを言っているのでしょうか?
うまくデータが書き込むためには、どこを修正すればよいのでしょうか?

C:直下に mysql フォルダ を置き、そのmysql フォルダの直下に test.sql を置きました。
test.sql の中味は、
create table shohin(・・・・・・・・);
insert into shohin(a,b,) values(pqr,xyz);
・・・・・・
と書いています。

この準備により、databese[zaiko] の [shohin]テーブルに、一括してデータを書き込みたいと思って、
mysql> use zaiko
Database changed
mysql> \.test.sql とすると、

Error:
Usage: \.<filename> | source<filename>
というエラーが出ます。

mysql>...続きを読む

Aベストアンサー

DOSプロンプト
c:\mysql>

から

mysql zaiko <.\test.sql

ではないかと。


通常、.はカレントディレクトリ,\はディレクトリの区切りを表すので、「.\」としたら「カレントディレクトリの」という意味です。SQLファイルのパスを指定しているだけかな?

参考URL:http://www.bitscope.co.jp/tep/MySQL/quickMySQL.html

QI'd like to do の過去形は?

「~したい」というときには、"I want to do"と言いますが、polite expression では、"I'd like to do"だということを以前教わって理解していたつもりなのですが、ふと「過去形では何と言うのかな?」という疑問が湧いてきました。

「~したかった」というときの"I want to do"の過去形は、"I wanted to do"だとわかるのですが、"I'd like to do"の過去形はどうやって表せばいいのですか?

"I'd like to do"は"I would like to do"だから、"I would have liked to do"になるのでしょうか?

Aベストアンサー

ご存知と思いますがなかなか英語と日本語は一対一には対応していないため、言い方はその内容により異なってきます。

>「やっと英会話スクールに入りました。前から行きたかったんです。」
という例ならば、普通に want でかまいません。(I've wanted to learn English in ESL classとか色々)
特に丁寧さに掛けるというわけでもありません。
あと、earger とか他の言葉による表現もあります。

なぜかというと、そもそもwantが強い表現で避ける理由は、自分の欲求をあからさまに主張する表現だから、それが実現していないにもかかわらず主張することがあさましい感じがするからなのです。

ですからそれをさけて would like to ~として、自分の欲求自体を仮定法を使って願望に変えているわけです。
つまり暗黙に、[if possible,] I would like to ~ と仮定の中において話しているから、控えめな表現とされるわけです。[]内は言葉にしませんがさまざまな適当な文に置き換えられるわけです。
日本語で言えば、「出来ましたら、~したいのですが、、、」のような表現ということです。

すでに実現した出来事に対して過去の自分の気持ちを言う場合には、would like のような表現は意味を成しません(仮定ではないわけですから)、wantのもつあさましさがあるわけではありません。(すでに実現しているから)

過去にそう思っていただけで現在も実現していないのであれば、仮定法過去をつかう表現にすることでwantのもつ浅ましさを消せるということです。

実現しているのであればwantは特に問題のある表現では無いということです。

ご存知と思いますがなかなか英語と日本語は一対一には対応していないため、言い方はその内容により異なってきます。

>「やっと英会話スクールに入りました。前から行きたかったんです。」
という例ならば、普通に want でかまいません。(I've wanted to learn English in ESL classとか色々)
特に丁寧さに掛けるというわけでもありません。
あと、earger とか他の言葉による表現もあります。

なぜかというと、そもそもwantが強い表現で避ける理由は、自分の欲求をあからさまに主張する表現だから、それが...続きを読む

QAUTO_INCREMENTのあるテーブルにinsertできません(長文)

mysql5.0.27(RedhatLinux 9)です。
属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。
Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。
状態をまとめると、以下のようになります。

・下記のテーブル定義で、テーブルは普通にcreateできた。
・descで確認しても、ちゃんとテーブルはできているよう。
・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。
・どうみても、コラム数は合っている(と思う)。
・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。
私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。

===== テーブル定義 =====
CREATE TABLE hoge (
id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL,
item1 VARCHAR (64) NOT NULL,
item2 VARCHAR (64) NOT NULL,
item3 VARCHAR (32) NOT NULL,
item4 VARCHAR (64),
item5 VARCHAR (64),
item6 VARCHAR (16) NOT NULL,
CONSTRAINT PK_HOGE PRIMARY KEY (id)
) type=innodb;
CREATE INDEX IDX_HOGE_1 ON hoge(item1);
CREATE INDEX IDX_HOGE_2 ON hoge(item2);
CREATE INDEX IDX_HOGE_3 ON hoge(item3);
CREATE INDEX IDX_HOGE_4 ON hoge(item4);
CREATE INDEX IDX_HOGE_5 ON hoge(item6);

===== descの出力 =====
+---------------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-----------------------+------+-----+---------+----------------+
| id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| item1 | varchar(64) | NO | MUL | | |
| item2 | varchar(64) | NO | MUL | | |
| item3 | varchar(32) | NO | MUL | | |
| item4 | varchar(64) | YES | MUL | NULL | |
| item5 | varchar(64) | YES | | NULL | |
| item6 | varchar(16) | NO | MUL | | |
+---------------------+-----------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

===== insert文 =====
insert into hoge (item1, item2, item3, item4, item5, item6)
values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6');

===== エラーメッセージ =====
ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1

長文大変申し訳ありません。よろしくお願いします。

mysql5.0.27(RedhatLinux 9)です。
属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。
Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。
状態をまとめると、以下のようになります。

・下記のテーブル定義で、テーブルは普通にcrea...続きを読む

Aベストアンサー

試しに
item1 VARCHAR (64) NOT NULL,
item2 VARCHAR (64) NOT NULL,
item3 VARCHAR (32) NOT NULL,
item4 VARCHAR (64),
item5 VARCHAR (64),
item6 VARCHAR (16) NOT NULL,
↑全て同じにしてみたらいかがでしょうか?
item1 VARCHAR (64) NOT NULL,
item2 VARCHAR (64) NOT NULL,
item3 VARCHAR (64) NOT NULL,
item4 VARCHAR (64) NOT NULL,
item5 VARCHAR (64) NOT NULL,
item6 VARCHAR (64) NOT NULL,
これでINSERTできるのならデータかテーブル構成かどちらかです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング