【问题标题】:MySQL query: Updating foreign key with unique IdMySQL 查询:使用唯一 ID 更新外键
【发布时间】:2018-03-08 06:14:27
【问题描述】:

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

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

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?

【问题讨论】:

  • 尽管您向我们提供了所有信息,但我实际上并没有看到明确的问题陈述。尤其是这两张表的连接逻辑是什么?
  • 实际的表格和情况非常复杂,这就是我大大简化的原因。粗略地说,逻辑是我需要一个一对一的关系并获得一个一对多的关系。甚至更简单:我需要将每条记录中的列更新为唯一值(在查找表中),但我没有得到唯一值。
  • 或者更清楚:查询的“NOT EXISTS”部分不起作用,我该如何解决这个问题?
  • “不在”,抱歉。
  • 你的问题还不清楚。如果你无法清楚地表达连接逻辑,那你怎么能指望我们这样做呢?

标签: mysql subquery unique


【解决方案1】:

我自己找到了一个带有变量的答案。这是可怕的,需要在表中的虚拟字段,但它的工作原理。我愿意改进。

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

【讨论】:

  • 更不用说它非常慢。
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多