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