質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

7810閲覧

last_insert_id()で返り値が0になってしまう

takashi5

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/05/02 13:57

編集2020/05/02 22:12

イメージ説明
イメージ説明

前提・実現したいこと

phpmyadminで直接SQLに書き込んでいます。

insertしたデータのAUTOINCREMENTに設定したidを取得したいです。

last_insert_id()を使用して取得できると思うのですが、#1064のエラーが出てしまいます。

該当のソースコード

MySQL

1insert into cart_table (id, user_id, item_id, amount, created_date, updated_date) values (null, 0, 13, 1, now(), now()) select last_insert_id() 2

試したこと

https://teratail.com/questions/19089
参考にしてみて、select last_insert_id()のみでデータベースに入力したところ0しか返ってきませんでした。

###質問したいこと
そもそも使い方が間違っているのか?
insertした直後にselect last_insert_idを使用しないとidは取得できないのか?
0しか返って来ない理由をお聞きしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/02 14:02

PHP上で実行してますか?それともMySQL上で実行してますか? PHPなのであればコードを提示してください。
m.ts10806

2020/05/02 14:03

> insertした直後にselect last_insert_idを使用しないとidは取得できないのか? 上記だけに答えることはできますが、last_insert_id()を使用しなければならない要件なのでしたら、追記を待ちます。
m.ts10806

2020/05/02 14:29

対象テーブルのCREATE文も提示願います。
takashi5

2020/05/02 21:57

m.ts10806様、追記依頼ありがとうございます。情報が不足していると思い、alter tableでprimary keyの削除と追加を実施したことを書いたつもりでしたが、前提の欄で記入しなければなりませんでした。 >上記だけに答えることはできますが、last_insert_id()を使用しなければならない要件なのでしたら、追記を待ちます。 last_insert_id()でなければならない要件ではありません。より良い選択肢があるのであればご教示いただけますと幸いです。
m.ts10806

2020/05/02 22:58

phpMyAdminの最後のキャプチャで出ているエラーは単にSQL文の区切り(;)がないからだと思います。 ひとまず、PHPは直接関係はないのでは?
guest

回答3

0

ベストアンサー

試してみました。

環境:
Windows
XAMPP7.3.2

CREATE

sql

1CREATE TABLE `name` ( 2 `id` int(11) NOT NULL, 3 `name` varchar(50) NOT NULL 4) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 5 6ALTER TABLE `name` 7 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 8COMMIT; 9

INSERT → SELECT

SQL

1insert into `name` (`name`) values ('hoge'); 2select last_insert_id();

イメージ説明

2回目

INSERT → SELECT

SQL

1insert into `name` (`name`) values ('hoge2'); 2select last_insert_id();

イメージ説明

できてますね。
提示された画像ではそもそもSQLのエラーが出ているので、そこはなおしましょう。
あと、あまり影響はないかと思いますが、AUTO_INCREMENTはカラム指定しなくても勝手にインクリメントしてくれるので、指定なしで試してみてください。

また、「AUTO_INCREMENTを使用しない方法」としては、「アプリケーション側でIDを払い出す」という方法です。
今回PHPをご利用でしたらPHP側で別途IDを払い出す仕組みを作ることですね。重複しなければいいので、これはどのような仕組みでも良いです(IDでソートするようなことがあれば連番になるように工夫が必要)

PDO::lastinsertidなど説明にあるように「異なる PDO ドライバ間で意味のあるもしくは 一貫性のある結果を返さないかも知れません。 」とある通り、期待した情報が得られない可能性があるからです。
「親情報をINSERTしてその親情報のIDをもって同時に子情報を作る」場合には私はアプリケーション側で払い出すようにしてます。

投稿2020/05/02 23:14

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takashi5

2020/05/03 03:53

m.ts1080様、ご回答ありがとうございます。再現できていなかったのはエラーを直せていなかったのが原因でした。指定なしでやってみました。親情報をINSERTしてその親情報のIDをもって同時に子情報を作る場合に異なるIDの情報の受け渡しがある可能性があるという解釈で間違い無いでしょうか? 質問にお答えして頂いただけでなく、丁寧な解説までして頂いてありがとうございます。
guest

0

質問に書かれたURLの回答にAUTO_INCREMENT の使用

CREATE TABLE animals (

id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id)

);

とあるのに、この質問に提示されたSQLにはPRIMARY KEY のDROP, ADD はあるけど(意味があるのか?)、CREATE TABLE が提示されていないので、AUTO_INCREMENT が設定されているか判断できません。エラーメッセージでAUTO_INCREMENT が設定されてないのだろう、って判断します。

投稿2020/05/02 14:26

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takashi5

2020/05/02 22:11

Orlofsky様、ご回答ありがとうございます。 質問の内容はMYSQLに直接書いたときの 質問となっております。質問に不備があり、お手数おかけてしまい申し訳ありません。 もしよろしければなのですが、Orlofsky様がこの状況であれば、どこに不備があってlast_insert_id() が処理されないのかをお考えになるか教示していただけないでしょうか? よろしくお願いします。
Orlofsky

2020/05/02 22:36

SQLで使われるテーブルはCREATE TABLEされている必要がある、って理解できていますか?CREATE TABLEの中にAUTO_INCREMENTが設定されていないのでは?と書きました。 あと、ID(AUTO_INCREMENTが設定されている列)を指定しないで挿入する、も参考に。 https://qiita.com/sakuraya/items/0dd0bb4114e56f42556d
takashi5

2020/05/03 04:04

Orlofsky様、回答ありがとうございます。MYSQLでデータベースを作る時にCREATE TABLE以外でテーブルを作成する方法を存じあげなかったので、軽視してしまいました。申し訳ございません。 qiita拝見させていただきました。ほぼ知らなかったことばかりだったので、とてもためになりました。 ありがとうございました。
guest

0

MYSQL

1insert into cart_table (id, user_id, item_id, amount, created_date, updated_date) values (null, 0, 13, 1, now(), now()); select last_insert_id(); 2

セミコロンを入れたところidを取得できました。
最後にinsertしたidをPHP上で変数に代入ができなかったので、mysqli_insert_id()を使用して実現できました。

PHP

1$sql = "insert into cart_table (id, user_id, item_id, amount, created_date, updated_date) values (null, 0, 13, 1, now(), now());" 2 3$cart_id = mysqli_insert_id($link);//id取得 4 5

投稿2020/05/05 03:49

takashi5

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問