在此更新中指定哪个表?

时间:2013-06-10 10:12:08

标签: mysql sql

我有两张结构相同的桌子。 Table1保留审核数据,table2保留其余数据。

表1

+------+--------+---------------+--------+-----------+
| "id" | "name" | "description" | "type" | "country" |
+------+--------+---------------+--------+-----------+
| "5"  | "a"    | "x"           | "1"    | "US"      |
| "6"  | "b"    | "x"           | "1"    | "UK"      |
+------+--------+---------------+--------+-----------+

表2

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

我运行下面的sql以使用来自table 1的数据更新table 2,并且效果很好。他们实际上是什么,是用户为不同的标题和描述建议的编辑。因此,可能有多个具有相同的orgId

UPDATE table1 a
INNER JOIN table2 b
ON a.id = b.id
SET a.name = b.name,
a.description = b.description
WHERE a.id=1; // Problem lies here

我的问题是,我的脚本中只有table2的{​​{1}},idtype,然后我将其传递给包含上述sql的函数

现在,我应该在country子句中指定哪个表?应该是WHERE还是a ~ table1。现在它是b ~ table2,但我在查询字符串中没有得到a的值,我不能使用a.id,因为那里有多个。{1}}。此外,通过查询字符串获取它将需要更多的代码和更改几件事。

如果我使用

会没问题
orgId

我试过这个并且它有效,但这是正确的做法吗?

2 个答案:

答案 0 :(得分:1)

是的,使用任何一个表中的id是安全的,因为它们用于加入。你甚至可以使用table2中的相同id,如下所示:

 UPDATE table1 a
    INNER JOIN table2 b
    ON a.id = b.id
    SET a.name = b.name,
    a.description = b.description
    WHERE a.id=3; // note a.id, it is safe to use a.id for the passed id as it is been used to join two tables.

答案 1 :(得分:0)

是的,完全没问题。联接可确保您获得正确的数据。

因此...

ON a.id = b.id

您可以在a.id = 3子句中使用b.id = 3WHERE