Mysql 替换为选择条件

Mysql 替换为选择条件,mysql,sql,Mysql,Sql,我有一张桌子: mysql> desc dialog; +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+

我有一张桌子:

mysql> desc dialog;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(11)          | NO   | PRI | NULL    | auto_increment |
| uid1      | int(11)          | NO   | MUL | NULL    |                |
| uid2      | int(11)          | NO   | MUL | NULL    |                |
| mid       | int(11)          | NO   |     | NULL    |                |
| anonym_id | int(10) unsigned | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
同样的一个:

mysql> desc dialogs;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(11)          | NO   | PRI | NULL    | auto_increment |
| uid1      | int(11)          | NO   | MUL | NULL    |                |
| uid2      | int(11)          | NO   | MUL | NULL    |                |
| mid       | int(11)          | NO   |     | NULL    |                |
| anonym_id | int(10) unsigned | NO   | MUL | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
第一个一对话框有一个重复的值,我在第二个对话框中不需要,结构是相同的,除了对话框表中的唯一索引:

mysql> show index from dialogs;
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| dialogs |          0 | PRIMARY   |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dialogs |          0 | uid1_uid2 |            1 | uid1        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dialogs |          0 | uid1_uid2 |            2 | uid2        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dialogs |          1 | uid2      |            1 | uid2        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| dialogs |          1 | anonym_id |            1 | anonym_id   | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)
我找到了从对话框插入对话框的方法,没有重复键,但有一个:

REPLACE INTO dialogs SELECT * FROM dialog;
就像一个符咒,但是-我需要测试uid2>uid1,然后反过来切换它们,插入uid1=uid2和uid2=uid1。是否有一个解决方案可以做到几乎相同,但使用这个带有1个查询的子句? 我尝试了类似的操作,但此查询无法执行:

REPLACE INTO dialogs 
    SELECT IF uid1<uid2 THEN * 
           ELSE id, uid2, uid1, mid, anonym_id 
END FROM dialog;
如果是这样的话,请举个例子,我试试看

Thx.

如果已经存在,您可以将ID保留在原位,而不是增加ID的替换。至于切换uid1、uid2的值,请在案例中设置值


REPLACE实际上是在执行删除操作,然后再进行添加,从而增加自动增量,您认为这样可以吗?这是您想要的行为吗?请为每个表发布一个小样本行集,显示输入和所需输出。如果可能,请将其设置为。不过,我想我明白你的意思,所以我会在下面发帖。
INSERT IGNORE INTO dialogs (id, uid1, uid2, mid, anonym_id)
  SELECT
    id,
    /* First prefer uid1, then the opposite for uid2 */
    CASE WHEN uid1 < uid2 THEN uid1 ELSE uid2 END,
    CASE WHEN uid1 < uid2 THEN uid2 ELSE uid1 END,
    mid,
    anonym_id
  FROM dialog