Абнаўленне калонкі ў двух розных табліц з адным SQL

У мяне ёсць дзве табліцы, якія ідэнтычныя па структуры. <�Код> Table1 трумы мадэрацыі дадзеных, table2 змяшчае дадзеныя, якія да гэтага часу не мадэруюцца.

<�Моцны> Табліца 1 </моцны>

+------+-----------+-----------------+--------+-----------+----------+
| "id" |  "name"   |  "description"  | "type" | "country" | "status" |
+------+-----------+-----------------+--------+-----------+----------+
| "1"  | "Title 1" | "Description 1" | "1"    | "US"      | "0"      |
| "2"  | "Title 2" | "Description 2" | "1 "   | "UK"      | "0"      |
+------+-----------+-----------------+--------+-----------+----------+

<�Моцны> Табліца 2 </моцны>

    +------+-----------+-----------------+--------+-----------+----------+
    | "id" |  "name"   |  "description"  | "type" | "country" | "status" |
    +------+-----------+-----------------+--------+-----------+----------+
    | "1"  | "Title 1" | "Description 1" | "1"    | "US"      | "2"      |
    | "2"  | "Title 2" | "Description 2" | "1 "   | "UK"      | "2"      |
    +------+-----------+-----------------+--------+-----------+----------+

Я спрабую абнавіць слупок Статус у абедзвюх табліцах з выкарыстаннем аднаго SQL. На самай справе, мадэратар абнаўлення толькі table2 паколькі гэта табліца наяўных у яго распараджэнні.

Калі table2 два абнаўляецца, можа table1 абнаўляцца ў той жа час? Выкарыстанне аднаго SQL? Прама цяпер, я выкарыстоўваю 2 розных convetional SQL заявы для гэтага.

Прама цяпер я раблю так:

UPDATE table2 set status = 0 where id = spid and country = spcountry;//Update table2 first

        UPDATE table1 a
        INNER JOIN table2 b
        ON a.id = b.id and a.country = b.country
        SET a.status = b.status
        WHERE a.id=spid;

<�Моцны> Тое, што я спадзяюся зрабіць: Прыклад

$status = 0;//php

update table1, table2 set status = $status where id=1 and conuntry = 'us' in table1 and table2.//The id and country need to be the same in both tables.
1
чаму вы хочаце выкарыстоўваць 1 SQL толькі?
дададзена аўтар Raptor, крыніца
чаму вы хочаце выкарыстоўваць 1 SQL толькі?
дададзена аўтар Raptor, крыніца
Гэта дублікат MySQL: stackoverflow.com/questions/8765490/& hellip;
дададзена аўтар Ben English, крыніца
Гэта дублікат MySQL: stackoverflow.com/questions/8765490/& hellip;
дададзена аўтар Ben English, крыніца
Паўтараюцца пытанне: stackoverflow.com/questions/2044467/…
дададзена аўтар Nikola R., крыніца

8 адказы

У той час як вы можаце абнавіць дзве табліцы з наступным сінтаксісам

UPDATE TBL1, TBL2
SET TBL1.status = 'Blah', TBL2.status = 'blah'
WHERE TBL1.id = TBL2.id 
      AND TBL2.id = 2;

but this could be harmful. Consider the following case: when TBL2 contains row with id = 2, while TBL1 does not have a row with id = 2. It causes update to fail. In order for this to work, TBL1 and TBL2 must be exactly the same. And if those two tables are exactly the same, why bother haven't two tables in the first place?


<�Р> @invisal Калі гэта не атрымоўваецца, усё, што будзе адбывацца ў гэты скажа 0 радкі абнаўляецца,   ці не так? Яно не выклікае сцэнар, каб спыніць працу. - jmenezes

Па-першае, вы павінны пераканацца, што гэтыя дзве табліцы маюць аднолькавыя дадзеныя:

  • Для любой ўстаўкі, неабходна ўставіць дзве табліцы
  • Для любога абнаўлення, вам неабходна абнавіць дзве табліцы
  • Для выдалення, неабходна выдаліць з двух табліц

Гэта не спыняе свой скрыпт працуе, але вы павінны забяспечыць выкананне гэтых умоў. Калі дзве табліцы ня кансістэнцыю, таму часам абнаўляць не будуць працаваць. Існуе не так моцна адрозніваецца ад сцэнара, які не працуе па прызначэнні і сцэнар, які кідаюць памылку. Абодва з іх не ў стане рабіць тое, што яны павінны рабіць.

2
дададзена
@invisal Калі гэта не атрымоўваецца, усё, што будзе адбывацца ў гэты будзе сказаць 0 радкі абнаўляецца , праўда? Яно не выклікае сцэнар, каб спыніць працу.
дададзена аўтар jmenezes, крыніца
Nice, вы даведаецеся нешта новае на гэта кожны дзень :)
дададзена аўтар Derek Tomes, крыніца
Вядома, гэта не спыніць скрыпт працуе, але вы будзеце мець супярэчлівыя дадзеныя, увесці новую памылку, якую цяжка адладжваць пазней.
дададзена аўтар invisal, крыніца

У той час як вы можаце абнавіць дзве табліцы з наступным сінтаксісам

UPDATE TBL1, TBL2
SET TBL1.status = 'Blah', TBL2.status = 'blah'
WHERE TBL1.id = TBL2.id 
      AND TBL2.id = 2;

but this could be harmful. Consider the following case: when TBL2 contains row with id = 2, while TBL1 does not have a row with id = 2. It causes update to fail. In order for this to work, TBL1 and TBL2 must be exactly the same. And if those two tables are exactly the same, why bother haven't two tables in the first place?


<�Р> @invisal Калі гэта не атрымоўваецца, усё, што будзе адбывацца ў гэты скажа 0 радкі абнаўляецца,   ці не так? Яно не выклікае сцэнар, каб спыніць працу. - jmenezes

Па-першае, вы павінны пераканацца, што гэтыя дзве табліцы маюць аднолькавыя дадзеныя:

  • Для любой ўстаўкі, неабходна ўставіць дзве табліцы
  • Для любога абнаўлення, вам неабходна абнавіць дзве табліцы
  • Для выдалення, неабходна выдаліць з двух табліц

Гэта не спыняе свой скрыпт працуе, але вы павінны забяспечыць выкананне гэтых умоў. Калі дзве табліцы ня кансістэнцыю, таму часам абнаўляць не будуць працаваць. Існуе не так моцна адрозніваецца ад сцэнара, які не працуе па прызначэнні і сцэнар, які кідаюць памылку. Абодва з іх не ў стане рабіць тое, што яны павінны рабіць.

2
дададзена
@invisal Калі гэта не атрымоўваецца, усё, што будзе адбывацца ў гэты будзе сказаць 0 радкі абнаўляецца , праўда? Яно не выклікае сцэнар, каб спыніць працу.
дададзена аўтар jmenezes, крыніца
Nice, вы даведаецеся нешта новае на гэта кожны дзень :)
дададзена аўтар Derek Tomes, крыніца
Вядома, гэта не спыніць скрыпт працуе, але вы будзеце мець супярэчлівыя дадзеныя, увесці новую памылку, якую цяжка адладжваць пазней.
дададзена аўтар invisal, крыніца

Хутчэй збіраецца абнавіць 2 табліцы з дапамогай аднаго аператара (які з'яўляецца грувасткім), ён можа быць лёгка п бяспечны спосаб выкарыстаць транзакцыі у Query/захоўваемай працэдуры. Гэта забяспечыць абнаўленне для абедзвюх табліц у хаду.

START TRANSACTION;
UPDATE table1 SET [email protected] WHERE type=1;
UPDATE table2 SET [email protected] WHERE type=1;
COMMIT;

спадзяюся, што гэта дапамога !!

1
дададзена

Хутчэй збіраецца абнавіць 2 табліцы з дапамогай аднаго аператара (які з'яўляецца грувасткім), ён можа быць лёгка п бяспечны спосаб выкарыстаць транзакцыі у Query/захоўваемай працэдуры. Гэта забяспечыць абнаўленне для абедзвюх табліц у хаду.

START TRANSACTION;
UPDATE table1 SET [email protected] WHERE type=1;
UPDATE table2 SET [email protected] WHERE type=1;
COMMIT;

спадзяюся, што гэта дапамога !!

1
дададзена

Гэта, верагодна, зрабіць гэта, але я не правяраў:

begin transaction t1;

UPDATE table2 
    set status = 0 
    where id = spid and country = spcountry;

UPDATE table1 a INNER JOIN table2 b ON a.id = b.id and a.country = b.country 
    SET a.status = b.status 
    WHERE a.id=spid;

commit transaction t1;
0
дададзена

Гэта, верагодна, зрабіць гэта, але я не правяраў:

begin transaction t1;

UPDATE table2 
    set status = 0 
    where id = spid and country = spcountry;

UPDATE table1 a INNER JOIN table2 b ON a.id = b.id and a.country = b.country 
    SET a.status = b.status 
    WHERE a.id=spid;

commit transaction t1;
0
дададзена

You can achieve your goal with a trigger on table2

CREATE TRIGGER tg_table2_update
AFTER UPDATE ON table2 
FOR EACH ROW
  UPDATE table1
     SET status = NEW.status
   WHERE id = NEW.id AND country = NEW.country;

Вось <�моцны> SQLFiddle дэма.

0
дададзена
Прабач, што я хацеў бы згадаць, што я не магу выкарыстоўваць трыгеры. Там ужо ёсць адзін.
дададзена аўтар jmenezes, крыніца
Мой існуючы трыгер таксама выклікаецца пасля абнаўлення. Гэта адзін робіцца для новых паведамленняў. Я спрабую атрымаць Reid ўсіх трыгераў, так як table2 атрымлівае так шмат абнаўленняў. <�Код> ПАЧАЦЬ КАЛІ NEW.STATUS = 0 затым устаўце table1 VALUES (NULL, NEW.name, NEW.description, NEW.type, NEW.country); END IF; END
дададзена аўтар jmenezes, крыніца
@jmenezes Вы можаце, верагодна, дадаць гэта абнаўленне для існуючага трыгера. Паказаць трыгер і будзе спрабаваць разабрацца.
дададзена аўтар peterm, крыніца

You can achieve your goal with a trigger on table2

CREATE TRIGGER tg_table2_update
AFTER UPDATE ON table2 
FOR EACH ROW
  UPDATE table1
     SET status = NEW.status
   WHERE id = NEW.id AND country = NEW.country;

Вось <�моцны> SQLFiddle дэма.

0
дададзена
Прабач, што я хацеў бы згадаць, што я не магу выкарыстоўваць трыгеры. Там ужо ёсць адзін.
дададзена аўтар jmenezes, крыніца
Мой існуючы трыгер таксама выклікаецца пасля абнаўлення. Гэта адзін робіцца для новых паведамленняў. Я спрабую атрымаць Reid ўсіх трыгераў, так як table2 атрымлівае так шмат абнаўленняў. <�Код> ПАЧАЦЬ КАЛІ NEW.STATUS = 0 затым устаўце table1 VALUES (NULL, NEW.name, NEW.description, NEW.type, NEW.country); END IF; END
дададзена аўтар jmenezes, крыніца
@jmenezes Вы можаце, верагодна, дадаць гэта абнаўленне для існуючага трыгера. Паказаць трыгер і будзе спрабаваць разабрацца.
дададзена аўтар peterm, крыніца