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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

7882閲覧

複数行複数列の同時更新の方法

hoshx

総合スコア16

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/05/19 10:31

###前提・実現したいこと
MySql workbenchで複数行表示される可能性のあるテーブルの複数列を一度に更新したいです。

###発生している問題・エラーメッセージ
以下を実行しても実行出来ません。
おそらく、Update以下がselect文で本当のテーブルで無いからだと思うのですが、
このselect文で抽出されるレコードを一度に全件更新したいのです。

###該当のソースコード
update
(SELECT ls.Deletedflag,ls.DeleteDate,ls.UpdateBy from
LiveStream ls
INNER JOIN Video v
ON v.VideoID = ls.VideoID
where
v.EpisodeID = 52061
AND v.DistributorID = 963) lv
set
ls.Deletedflag = 1,
ls.DeleteDate = Now(),
ls.UpdateBy = 'DelEpisode'
;

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/05/19 10:33

出力されたエラーメッセージをそのままコピペしてください。
hoshx

2016/05/20 01:51

以下のメッセージが出力されていました。 Error Code: 1288. The target table lv of the UPDATE is not updatable 対象の表は更新不可能です。って意味ですよね。何ででしょう。
guest

回答2

0

ベストアンサー

つまり、更新したいのは LiveStream の列で、条件には LiveStreamVideo を結合して Video の列を使いたいということでしょうか?

たぶん、相関サブクエリを使うと簡単なんじゃないかと思います。あっているかどうかわかりませんが次のような感じです。

sql

1update 2 LiveStream ls 3set 4 Deletedflag = 1, 5 DeleteDate = Now(), 6 UpdateBy = 'DelEpisode' 7where 8 exists ( 9 select * from Video v 10 where v.VideoID = ls.VideoID 11 and v.EpisodeID = 52061 12 and v.DistributorID = 963 13 )

もしくはサブクエリを次のように展開しても同じかもしれません。

sql

1update 2 LiveStream ls INNER JOIN Video v ON v.VideoID = ls.VideoID 3set 4 ls.Deletedflag = 1, 5 ls.DeleteDate = Now(), 6 ls.UpdateBy = 'DelEpisode' 7where 8 v.EpisodeID = 52061 AND v.DistributorID = 963

投稿2016/05/19 12:54

ngyuki

総合スコア4514

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

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

hoshx

2016/05/20 01:46

追加でSET SQL_SAFE_UPDATES = 0;が必要でしたが、 こちらのSQL利用したら実現できました。 ありがとうございました。
guest

0

とりあえず「トランザクション」について
調査されるようオススメいたします。
ちなみに、データベースの更新に関する用語です。

投稿2016/05/19 10:55

takasima20

総合スコア7458

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

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

退会済みユーザー

退会済みユーザー

2016/05/19 10:59

トランザクションは、この質問には無関係だと思いますよ。
takasima20

2016/05/19 12:18

To: Kosuke_Shibuyaさん いやー「一度に全件更新」に脊髄反射しゃいましたわ~ (^_^; つまり、こういうことスかね。 UPDATE LiveStream SET Deletedflag = 1, DeleteDate = Now(), UpdateBy = 'DelEpisode' WHERE VideoID IN ( SELECT ls.VideoID FROM LiveStream ls INNER JOIN Video v ON v.VideoID = ls.VideoID WHERE v.EpisodeID = 52061 AND v.DistributorID = 963);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問