UPDATE/INSERT INTO/DELETE 来自 table 在 MYSQL
UPDATE/INSERT INTO/DELETE FROM table in MYSQL
我在 MYSQL 数据库 TABLE1 中有一个 table,列 COLA、COLB、COLC 和 (COLA,COLB) 是复合主键。像这样
-----------------------
| COLA | COLB | COLC |
-----------------------
| A | B | C |
-----------------------
| A | Q | D |
-----------------------
| A | E | J |
-----------------------
| B | W | P |
-----------------------
还有一个后台脚本将数据传递给 java 程序,该程序应在以下条件下更新 table :
- If new values have any new pair for PRIMARY KEYs then INSERT new row into the table.
- If new values have any common pair for PRIMARY KEYs then UPDATE the table.
- DELETE all other rows Where COLA value matches with new values.
如果新值是 ('A','B','L'),('A' ,'Y','D'),('A','Q','Z') 那么它应该:
- 更新第一和第二行。
- 插入一个新行('A'、'Y'、'D')。
- 仅删除第 第 3 行。
所以 table 应该看起来像
-----------------------
| COLA | COLB | COLC |
-----------------------
| A | B | L |
-----------------------
| A | Q | Z |
-----------------------
| B | W | P |
-----------------------
| A | Y | D |
-----------------------
为了实现这个,我 运行 两个查询:
INSERT INTO TABLE1 VALUES('A','B','L'),('A','Y','D'),('A','Q','Z') ON DUPLICATE KEY UPDATE COLC=VALUES(COLC);
这是我想要的方式。但是当我尝试删除其他行时,我遇到了问题,我正在尝试的是:
DELETE FROM TABLE1 WHERE NOT ((COLA='A' AND COLB='B') OR (COLA='A' AND COLB='Y') OR (COLA='A' AND COLB='Q'));
但是没有用。因为它也删除了最后一行。
所以
- 如何实现查询?
- 能否合并为一个查询?
提前致谢:)
我得到了第一个问题的答案。查询应该是
DELETE FROM TABLE1 WHERE COLA='A' AND NOT ((COLA='A' AND COLB='B') OR (COLA='A' AND COLB='Y') OR (COLA='A' AND COLB='Q'));
我也找不到针对此问题的查询解决方案,但对于第二个查询,稍微优化的版本可以是:
DELETE FROM TABLE1 WHERE COLA='A' AND COLB NOT IN ('B','Y','Q');
或
DELETE FROM TABLE1 WHERE COLA='A' AND COLC NOT IN ('L','Z','D');
以上任何一种都可以使用,并且比您提供的更具可扩展性。
我在 MYSQL 数据库 TABLE1 中有一个 table,列 COLA、COLB、COLC 和 (COLA,COLB) 是复合主键。像这样
-----------------------
| COLA | COLB | COLC |
-----------------------
| A | B | C |
-----------------------
| A | Q | D |
-----------------------
| A | E | J |
-----------------------
| B | W | P |
-----------------------
还有一个后台脚本将数据传递给 java 程序,该程序应在以下条件下更新 table :
- If new values have any new pair for PRIMARY KEYs then INSERT new row into the table.
- If new values have any common pair for PRIMARY KEYs then UPDATE the table.
- DELETE all other rows Where COLA value matches with new values.
如果新值是 ('A','B','L'),('A' ,'Y','D'),('A','Q','Z') 那么它应该:
- 更新第一和第二行。
- 插入一个新行('A'、'Y'、'D')。
- 仅删除第 第 3 行。
所以 table 应该看起来像
-----------------------
| COLA | COLB | COLC |
-----------------------
| A | B | L |
-----------------------
| A | Q | Z |
-----------------------
| B | W | P |
-----------------------
| A | Y | D |
-----------------------
为了实现这个,我 运行 两个查询:
INSERT INTO TABLE1 VALUES('A','B','L'),('A','Y','D'),('A','Q','Z') ON DUPLICATE KEY UPDATE COLC=VALUES(COLC);
这是我想要的方式。但是当我尝试删除其他行时,我遇到了问题,我正在尝试的是:
DELETE FROM TABLE1 WHERE NOT ((COLA='A' AND COLB='B') OR (COLA='A' AND COLB='Y') OR (COLA='A' AND COLB='Q'));
但是没有用。因为它也删除了最后一行。 所以
- 如何实现查询?
- 能否合并为一个查询?
提前致谢:)
我得到了第一个问题的答案。查询应该是
DELETE FROM TABLE1 WHERE COLA='A' AND NOT ((COLA='A' AND COLB='B') OR (COLA='A' AND COLB='Y') OR (COLA='A' AND COLB='Q'));
我也找不到针对此问题的查询解决方案,但对于第二个查询,稍微优化的版本可以是:
DELETE FROM TABLE1 WHERE COLA='A' AND COLB NOT IN ('B','Y','Q');
或
DELETE FROM TABLE1 WHERE COLA='A' AND COLC NOT IN ('L','Z','D');
以上任何一种都可以使用,并且比您提供的更具可扩展性。