在MYSQL中更新/插入INTO / DELETE表

时间:2017-09-15 04:47:08

标签: mysql database sql-update sql-insert sql-delete

我在MYSQL数据库TABLE1中有一个表,列COLA,COLB,COLC和(COLA,COLB)是复合主键。像这样的东西

-----------------------
|  COLA | COLB | COLC |
-----------------------
|   A   |  B   |  C   |
-----------------------
|   A   |  Q   |  D   |
-----------------------
|   A   |  E   |  J   |
-----------------------
|   B   |  W   |  P   |
-----------------------

还有后台脚本将数据传递给java程序,该程序应在以下条件下更新表:

  
      
  1. 如果新值有 PRIMARY KEY 的新对,则 INSERT 新行进入表格。
  2.   
  3. 如果新值包含 PRIMARY KEYs 的任何公共对,则更新表。
  4.   
  5. 删除所有其他行 COLA值匹配的新值。
  6.   

如果新的vaues ('A','B','L')('A','Y','D'),< strong>('A','Q','Z')那么它应该:

  1. 更新第一第二行。
  2. 插入一个新行('A','Y','D')。
  3. 仅删除第3行行。
  4. 所以表应该看起来像

    -----------------------
    |  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'));
    

    但它不起作用。因为它也删除了最后一行。 所以

    1. 如何实现查询?
    2. 可以将其分成一个查询吗?
    3. 感谢先生:)

2 个答案:

答案 0 :(得分:0)

我得到了第一个问题的答案。查询应该是

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'));

答案 1 :(得分:0)

我也找不到该问题的一个查询解决方案,但对于第二个查询,可以使用以下优化版本:

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');

可以使用上述任何一种方法,并且可以比您提供的方法进行扩展。