2013-06-05 116 views
1

我有兩個表是在結構上是相同的。 Table1持有主持人數據,table2認爲仍未緩和數據。更新在兩個不同的表的列具有一個SQL

表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表來更新列status。其實,主持人只更新table2因爲這是提供給他的表。

table2 2得到更新,可以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. 
+0

重複的問題:http://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005 –

+0

這個副本是mysql:http:/ /stackoverflow.com/questions/8765490/mysql-update-two-tables-at-once –

+0

爲什麼你只想使用1個SQL? – Raptor

回答

2

雖然你可以更新兩個表的語法如下

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

但是這可能是有害的。考慮以下情況:當TBL2包含ID = 2排,而TBL1沒有與ID = 2的行它會導致更新失敗。爲了實現這一點,TBL1和TBL2必須完全相同。 如果這兩張表完全一樣,爲什麼還有一張沒有兩張表呢?


@invisal如果失敗,所有會發生的是它會說0行更新, 吧?它不會導致腳本停止運行。 - jmenezes

首先,你需要確保這兩個表具有相同的數據:

  • 對於任何插入,你需要插入到兩個表
  • 對於任何更新,您需要更新兩個表
  • 刪除,則需要從兩個表
  • 刪除

它不會停止運行腳本,但你需要ŧ o執行這些條件。如果兩個表不是一致的,那麼有時更新不起作用。不符合預期的腳本與引發錯誤的腳本沒有多大區別。他們兩人都沒有做他們應該做的事情。

+0

不錯,你每天都會在SO上學到新的東西:) –

+0

@invisal如果失敗了,所有會發生的事情就會說'0 rows updated',對吧?它不會導致腳本停止運行。 – jmenezes

+0

當然,它不會阻止腳本運行,但是您將會遇到不一致的數據,這些數據會引入一個新的錯誤,以後很難再調試。 – invisal

0

可以實現與觸發你的目標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

+0

@jmenezes您可以將此更新添加到您現有的觸發器中。顯示你的觸發器,並嘗試將其整理出來。 – peterm

+0

我的現有觸發器也在更新後調用。這個是爲新帖子完成的。我試圖得到所有觸發器的reid,因爲table2得到了很多更新。 'BEGIN \t IF NEW.STATUS = 0 THEN \t \t INSERT INTO table1 VALUES(NULL,NEW.name,NEW.description,NEW.type,NEW.country); \t END IF; END' – jmenezes

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; 
1

而是要更新2分表用一個語句(這是麻煩的),它可以是一個簡單的ñ更安全的方式在查詢/存儲過程中使用Transactions。它將確保更新這兩個表。

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

希望對您有所幫助!

相關問題