sql—如何在mysql中设置唯一键,将记录从一个表复制到另一个表而不产生重复

zi8p0yeb  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(232)

我有一张table users_exam_question_answer 有以下记录 mysql table。现在,我想复制没有重复值的记录。下面第2、4、7、8、9行是第1行的重复记录。如何将除上述行号以外的所有记录复制到新表中。这是我的sql表,其中为 user_id , exam_id , question_id 柱。

CREATE TABLE IF NOT EXISTS `users_exam_question_answer` (
  `user_exam_question_answer_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `exam_id` int(11) NOT NULL,
  `question_id` int(11) NOT NULL,
  `user_answer_option` enum('0','1','2','3','4') NOT NULL DEFAULT '0',
  `marks` float DEFAULT '0',
  `createdon` datetime DEFAULT NULL,
  `modion` datetime DEFAULT NULL,
  PRIMARY KEY (`user_exam_question_answer_id`),
  UNIQUE KEY `user_exam_question_answer` (`user_id`,`exam_id`,`question_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8191 DEFAULT CHARSET=latin1;
`id`,`userid`,`examid`,`question_id`,`answers`
----------------------------------------------
(1, 5259, 25, 226, '4'),
(2, 5259, 25, 226, '4'),
(3, 5259, 25, 227, '2'),
(4, 5259, 25, 226, '4'),
(5, 5259, 25, 228, '1'),
(6, 5259, 25, 229, '3'),
(7, 5259, 25, 226, '4'),
(8, 5259, 25, 226, '4'),
(9, 5259, 25, 226, '4'),

我怎样才能解决这个问题?请帮忙,数据集太大了。

bvhaajcl

bvhaajcl1#

最简单的方法似乎是

INSERT IGNORE ... INTO table2 SELECT * FROM table1;

table2上的unique约束将自动删除所有重复的行,并且您将根据索引只插入不重复的行。不管这是不是你想要的行为,只有你能说;你的问题没有明确说明这一点。
更清楚地说,在你的设置中,

1, 5259, 25, 226, '4'
...
123, 5259, 25, 226, '12'

将插入第一行(第五列将有一个“4”),第123行将被忽略。实际上,在mysql中,没有硬保证哪一行会被插入到那些具有相同索引列的行中。它通常是第一个,但可能不是。如果您需要指定,即插入第1行或第123行的条件,那么正确的答案是-一如既往:-)-gordon linoff的。

qmelpv7a

qmelpv7a2#

你想要什么 distinct ?

insert into new_table (userid, examid, question_id, answers)
select distinct userid, examid, question_id, answers
from users_exam_question_answer

这假设目标表和源表一样有一个自动递增的主键,因此不需要为insert提供这个值。

erhoui1w

erhoui1w3#

你想要什么我有点困惑。有四列定义唯一行,但您仅为唯一约束指定三列。这意味着聚合:

select userid, examid, question_id, max(answers)
from users_exam_question_answer
group by userid, examid, question_id;

在您的示例数据中 answers 如果其他三列的值相同,则为相同。不过,问题并没有具体说明情况必然如此。

相关问题