MySQL查询: Updating foreign key with unique Id

标签 mysql subquery unique

我需要一对一链接两个表,但要比较和链接的值不是唯一的。

我找不到办法。作为示例,我添加了一个非常简单的版本。

CREATE TABLE `T1` (
  `id` int(6) unsigned NOT NULL,
  `cmp` int(3) NOT NULL,
  `uniqueT2Id` int(3) unsigned,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `T2` (
  `id` int(6) unsigned NOT NULL,
  `cmp` int(3) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `T1` (`id`, `cmp`, `uniqueT2Id`) VALUES
  ('1', '1', NULL),
  ('2', '1', NULL),
  ('3', '2', NULL),
  ('4', '3', NULL),
  ('5', '1', NULL);

INSERT INTO `T2` (`id`, `cmp`) VALUES
  ('1', '1'),
  ('2', '1'),
  ('3', '1'),
  ('4', '2'),
  ('5', '3');

UPDATE T1 SET uniqueT2Id=
(SELECT id FROM T2 WHERE T2.cmp=T1.cmp AND
  id NOT IN (SELECT * FROM 
               (SELECT uniqueT2Id FROM T1 WHERE uniqueT2Id IS NOT NULL) X) 
 ORDER BY id ASC LIMIT 1);

SELECT * FROM T1;

http://sqlfiddle.com/#!9/3bab7c/2/0

结果是

id  cmp uniqueT2Id
1   1   1
2   1   1
3   2   4
4   3   5
5   1   1

我想要这样

id  rev uniqueT2Id
1   1   1
2   1   2
3   2   4
4   3   5
5   1   3

在更新中,我尝试选择一个尚未使用的 ID,但这显然不起作用。有谁知道在 MySQL 中执行此操作的方法,最好不用 PHP?

最佳答案

我自己找到了答案,有变量。这很糟糕,需要在表中添加一个虚拟字段,但它可以工作。我愿意接受改进。

CREATE TABLE `T1` (
  `id` int(6) unsigned NOT NULL,
  `cmp` int(3) NOT NULL,
  `uniqueT2Id` int(3) NULL,
  `dummy` varchar(200) NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `T2` (
  `id` int(6) unsigned NOT NULL,
  `cmp` int(3) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `T1` (`id`, `cmp`, `uniqueT2Id`) VALUES
  ('1', '1', NULL),
  ('2', '1', NULL),
  ('3', '2', NULL),
  ('4', '5', NULL),
  ('5', '3', NULL),
  ('6', '1', NULL);

INSERT INTO `T2` (`id`, `cmp`) VALUES
  ('1', '1'),
  ('2', '1'),
  ('3', '1'),
  ('4', '2'),
  ('5', '3');

SET @taken = '/' ;
UPDATE T1 
SET uniqueT2Id= @new:=
  (SELECT id FROM T2 WHERE T2.cmp=T1.cmp AND
    INSTR(@taken, CONCAT('/',id,'/')) = 0
   ORDER BY id ASC LIMIT 1),
  dummy=IF(@new IS NOT NULL,@taken:=CONCAT(@taken, @new, "/"),NULL);

http://sqlfiddle.com/#!9/4a61d/1/0

关于MySQL查询: Updating foreign key with unique Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166578/

相关文章:

C++ list.unique() 会调整列表的大小吗?

php - 检查整个字符串是否包含相同的字符

mysql - 如何仅返回日期字段中具有最大年份的 SQL 行?

mysql - 一堆子查询的可能替代方案

mysql - 子查询执行时间 : localhost = 2 seconds/server = 98+ seconds

hibernate 条件和计数列

java - 不使用 Random 类生成唯一的 4 位随机数

php - 徽章解锁通知设置

python - python pyodbc中选择时间查询问题

mysql - 在数据库中创建、更新、删除 View