Mysql SQL:使用唯一值复制行并更改列值
我是一个新的SQL用户,我需要一些帮助 我有一个包含多个数据列的表。兴趣的两列分别称为“课程id”和“年份” 我试图做的是将所有具有唯一“course_id”的行复制到具有相同数据但具有不同年份的新行。我发现很难准确地解释我想要什么,所以这里有一个例子(按课程编号排序): 如果我想更新此表以添加“2017年”,我会得到:Mysql SQL:使用唯一值复制行并更改列值,mysql,Mysql,我是一个新的SQL用户,我需要一些帮助 我有一个包含多个数据列的表。兴趣的两列分别称为“课程id”和“年份” 我试图做的是将所有具有唯一“course_id”的行复制到具有相同数据但具有不同年份的新行。我发现很难准确地解释我想要什么,所以这里有一个例子(按课程编号排序): 如果我想更新此表以添加“2017年”,我会得到: id year course_id 1 2014 1 2 2015 1 7
id year course_id
1 2014 1
2 2015 1
7 2017 1
3 2014 2
4 2015 2
5 2016 2
8 2017 2
6 2014 3
9 2017 3
具有相同课程ID的所有行都具有相同的数据,因此ID 7将具有与ID 1和ID 2相同的数据,但列“year”不同
由于对SQL如此陌生,我很难找到解决方案。有经验的人能帮我吗?在SQL Server中(年的方括号中):
您可以从表中插入不同的课程id
s,以及年份的值,如下所示:
insert into tbl ([year],course_id)
select distinct
2017
, course_id
from tbl
在MySQL中:
insert into tbl (`year`,course_id)
select distinct
2017
, course_id
from tbl
我还建议使用notexists
,这样查询就可以被重新运行多次,并且永远不会抛出PK冲突异常。也许你的情况不需要
INSERT INTO tbl (`year`, course_id)
SELECT DISTINCT 2017, course_id
FROM tbl AS t1
WHERE NOT EXISTS ( SELECT 1
FROM tbl AS t2
WHERE t2.course_id = t1.course_id
AND t2.`year` = 2017);
此外,为了获得最佳性能,您可以添加索引,以便引擎可以高效地查找记录
ALTER TABLE `tbl ` ADD INDEX `ix_tbl_year_course_id` (`year`, `course_id`)
这不是一个有效的解决方案,但会奏效。用任何编程语言编写查询
Connection con = DriverManager.getConnection(url, userName, password);
Statement s1 = con.createStatement();
ResultSet rs = s1.executeQuery(select distinct course_id from tbl);
while(rs.next()){
String item = rs.getString("course_id");
String query="insert into tbl(year,course_id) values('2017',"+item+")";
ResultSet rs1 = s1.executeQuery(query);
}
我希望您了解“如何使用编程语言与数据库交互。我们可以假设您的列id是自动增量id,因此我们不需要考虑如何插入正确的id吗?是的,列id是自动增量id。请修改标记、MySQL(Oracle)和SQL Server(Mircosoft)是两种不同的东西。哇!说明了我知道多少:)这并不是我所需要的,因为我有超过两列的数据,但这个解决方案+更多的研究产生了一个有效的解决方案:)谢谢!@L.Hed很乐意帮助!
Connection con = DriverManager.getConnection(url, userName, password);
Statement s1 = con.createStatement();
ResultSet rs = s1.executeQuery(select distinct course_id from tbl);
while(rs.next()){
String item = rs.getString("course_id");
String query="insert into tbl(year,course_id) values('2017',"+item+")";
ResultSet rs1 = s1.executeQuery(query);
}