ホームページ > データベース > mysql チュートリアル > join update vs sub-selects update

join update vs sub-selects update

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-07 16:10:51
オリジナル
1223 人が閲覧しました

开发说使用多表关联进行更新的时候发现没有正确的更新记录(事后发现是条件问题),之前一直没怎么使用关联更新,这次看了下,发现了个问题,当返回多行记录的时候并不会像传统的子查询更新那样报错,而是随机选择一个记录进行更新( 貌似最后一个? ) 因此

开发说使用多表关联进行更新的时候发现没有正确的更新记录(事后发现是条件问题),之前一直没怎么使用关联更新,这次看了下,发现了个问题,当返回多行记录的时候并不会像传统的子查询更新那样报错,而是随机选择一个记录进行更新(貌似最后一个?
因此,虽然关联更新会快很多,但是要考虑的这个不确定带来的隐患。

gtlions=# create table joinupdate1(id int,name varchar(20));
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
gtlions=# create table joinupdate2(id int,name varchar(20));
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
gtlions=# insert into  joinupdate1 values(1,'a');
INSERT 0 1
gtlions=# insert into  joinupdate1 values(2,'b');
INSERT 0 1
gtlions=# insert into  joinupdate2 values(1,'b');
INSERT 0 1
gtlions=# insert into  joinupdate2 values(2,'b');
INSERT 0 1
gtlions=# truncate table joinupdate2;
TRUNCATE TABLE
gtlions=# insert into  joinupdate2 values(1,'c');
INSERT 0 1
gtlions=# insert into  joinupdate2 values(2,'d'); 
INSERT 0 1
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | a
  2 | b
(2 rows)

gtlions=# select * from joinupdate2;
 id | name 
----+------
  1 | c
  2 | d
(2 rows)

gtlions=# begin;
BEGIN
gtlions=# update joinupdate1 set name=(select name from joinupdate2 where joinupdate1.id=joinupdate2.id);
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | c
  2 | d
(2 rows)

gtlions=# rollback;
ROLLBACK
gtlions=# end;
WARNING:  there is no transaction in progress
COMMIT
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | a
  2 | b
(2 rows)

gtlions=# begin;
BEGIN
gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id;
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | c
  2 | d
(2 rows)

gtlions=# rollback;
ROLLBACK
gtlions=# insert into joinupdate2 values(1,'e');
INSERT 0 1
gtlions=# begin;
BEGIN
gtlions=# update joinupdate1 set name=(select name from joinupdate2 where joinupdate1.id=joinupdate2.id);
ERROR:  more than one row returned by a subquery used as an expression  (seg0 slice2 h1:40000 pid=14123)
gtlions=# rollback;
ROLLBACK
gtlions=# begin;
BEGIN
gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id;
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | e
  2 | d
(2 rows)

gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id;
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | e
  2 | d
(2 rows)

gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id;
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | e
  2 | d
(2 rows)

gtlions=# insert into joinupdate2 values(1,'f');
INSERT 0 1
gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id;
UPDATE 2
gtlions=# select * from joinupdate1;
 id | name 
----+------
  1 | f
  2 | d
(2 rows)

gtlions=# rollback;
ROLLBACK
ログイン後にコピー

-EOF-

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート