mysql:16446
From: meiji kimura <meiji kimura <meiji.kimura@xxxxxxxxxx>>
Date: Mon, 04 Dec 2017 10:04:29 +0900
Subject: [mysql 16446] Re: MySQL8.0のwindow関数と他DBとの比較結果
木村明治です。状況を以下のようにバグ登録し、担当者からの回答がついてます。 CTE with window function don't work with update/delete as expected. https://bugs.mysql.com/bug.php?id=88397 (Bug内では動作する例としてSQL Server 2017 on Linuxを使ってます) 少なくとも制限に書く必要はありそうなので、その点は別途バグ登録しようと思 います。 (2017/11/04 14:35), mysql201706mailing@xxxxxxxxxx wrote: > 明智重蔵です。 > > MySQL8.0でWindow関数を使ったビューは、 > 更新(および削除)不可のようですね。 > ありがとうございました。 > > ----- Original Message ----- > *From:* meiji kimura <meiji.kimura@xxxxxxxxxx> > *To:* ml@xxxxxxxxxx > *Date:* 2017/11/4, Sat 13:04 > *Subject:* [mysql 16440] Re: MySQL8.0のwindow関数と他DBとの比較結果 > > 木村明治です。 > > 取り急ぎためしてみました。 > > (2017/11/04 12:03), mysql201706mailing@xxxxxxxxxx > <mailto:mysql201706mailing@xxxxxxxxxx> wrote: > > 明智重蔵です。 > > > > MySQL8.0のWindow関数を他DBと比較してまして、 > > MySQLエキスパートの皆様に御願いがあります。 > > > > MySQL8.0が動かせる方がおりましたら、 > > 比較3を、試した結果を書いていただけないでしょうか? > > (同様の比較をされる方に、有用な情報になると思いますので) > > 8.0.3では以下のようにどちらもエラーになります。 > > mysql [localhost] {msandbox} (test) > > mysql [localhost] {msandbox} (test) > with UpdView as( > -> select Val,Row_Number() over(order by Val) as NewVal > -> from TestTable) > -> update UpdView set Val = NewVal; > ERROR 1288 (HY000): The target table UpdView of the UPDATE is not > updatable > > mysql [localhost] {msandbox} (test) > > mysql [localhost] {msandbox} (test) > with DelView as( > -> select Row_Number() over(order by Val) as rn > -> from TestTable) > -> delete from DelView where rn < 3; > ERROR 1146 (42S02): Table 'test.DelView' doesn't exist > > > ■■■比較1■■■■■■■■■■■■■■■■■■■■■■■■■■■ > > Oracleで可能な、 > > Lag,Lead,First_Value,Last_Value,Nth_Valueでのignore nulls > > > > > https://www.slideshare.net/oysteing/common-table-expressions-cte-window-functions-in-mysql-80 > <https://urldefense.proofpoint.com/v2/url?u=https-3A__www.slideshare.net_oysteing_common-2Dtable-2Dexpressions-2Dcte-2Dwindow-2Dfunctions-2Din-2Dmysql-2D80&d=DwMFaQ&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=GNgoqPdiFhTG1pZngMpFGFaAQsvtTeh5BjMIGT-TWsw&m=0uQDDzbyFE16M3mLi3ugypzv7jpcjZ0cDUZs1PU-reE&s=fl62__JrM6nBPARIUMnSLyhC_uAzd7S8NXl_q17EnTk&e=> > > の48ページと49ページによると、MySQL8.0では不可 > > > > ■■■比較2■■■■■■■■■■■■■■■■■■■■■■■■■■■ > > ソートキーが日付型で、Range指定でのInterVal型の使用 > > > > > https://www.slideshare.net/oysteing/common-table-expressions-cte-window-functions-in-mysql-80 > <https://urldefense.proofpoint.com/v2/url?u=https-3A__www.slideshare.net_oysteing_common-2Dtable-2Dexpressions-2Dcte-2Dwindow-2Dfunctions-2Din-2Dmysql-2D80&d=DwMFaQ&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=GNgoqPdiFhTG1pZngMpFGFaAQsvtTeh5BjMIGT-TWsw&m=0uQDDzbyFE16M3mLi3ugypzv7jpcjZ0cDUZs1PU-reE&s=fl62__JrM6nBPARIUMnSLyhC_uAzd7S8NXl_q17EnTk&e=> > > の35ページによると、MySQL8.0で可能です > > > > ■■■比較3■■■■■■■■■■■■■■■■■■■■■■■■■■■ > > SQLServerで可能な、 > > Window関数を使用したインラインビューでのUpdateとDelete > > > > create table TestTable( > > Val int unsigned); > > > > insert into TestTable values > > (1),(3),(5),(10),(20),(30),(40); > > > > with UpdView as( > > select Val,Row_Number() over(order by Val) as NewVal > > from TestTable) > > update UpdView set Val = NewVal; > > > > with DelView as( > > select Row_Number() over(order by Val) as rn > > from TestTable) > > delete from DelView where rn < 3; > > > > > https://www.slideshare.net/oysteing/mysql-80-common-table-expressions-71760102 > <https://urldefense.proofpoint.com/v2/url?u=https-3A__www.slideshare.net_oysteing_mysql-2D80-2Dcommon-2Dtable-2Dexpressions-2D71760102&d=DwMFaQ&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=GNgoqPdiFhTG1pZngMpFGFaAQsvtTeh5BjMIGT-TWsw&m=0uQDDzbyFE16M3mLi3ugypzv7jpcjZ0cDUZs1PU-reE&s=e9eMsXBdHrncSYvXL1k8fR7SzBU2BHA9M0Q0LeByj0Q&e=> > > の5ページに書いてある構文です。 > > > > https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html > > にWindow関数を使うと更新(および削除)不可と書いてないので > > 更新(および削除)可能と予想してます。 > > 上記のとおりです。ちなみにFirebird 3.0の場合は、そもそもCTEがselectのみ > の対応なので、当然エラーになります。(token select 以外は×) > > create table TestTable(Val int); > > insert into TestTable values(1); > insert into TestTable values(3); > insert into TestTable values(5); > insert into TestTable values(10); > insert into TestTable values(20); > insert into TestTable values(30); > insert into TestTable values(40); > > commit; > SQL> with UpdView as( > CON> select Val,Row_Number() over(order by Val) as NewVal > CON> from TestTable) > CON> update UpdView set Val = NewVal; > Statement failed, SQLSTATE = 42000 > Dynamic SQL Error > -SQL error code = -104 > -Token unknown - line 4, column 1 > -update > SQL> > SQL> with DelView as( > CON> select Row_Number() over(order by Val) as rn > CON> from TestTable) > CON> delete from DelView where rn < 3; > Statement failed, SQLSTATE = 42000 > Dynamic SQL Error > -SQL error code = -104 > -Token unknown - line 4, column 1 > -delete >
@ 16439 2017-11-04 12:03 [<mysql201706mailing@] MySQL8.0のwindow関数と他DBとの比較結果 16440 2017-11-04 13:04 ┗[meiji kimura <meiji.] @ 16441 2017-11-04 14:35 ┗[<mysql201706mailing@] Re: [mysql 16440] Re: MySQL8.0のwindow関数と他DBとの比較結果 -> 16446 2017-12-04 10:04 ┗[meiji kimura <meiji.] Re: MySQL8.0のwindow関数と他DBとの比較結果