首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次更新多行的非键ID列

一次更新多行的非键ID列
EN

Database Administration用户
提问于 2017-05-16 15:47:37
回答 2查看 172关注 0票数 1

我继承了一个运行在Webdev18上的设计糟糕的数据库。

大多数表在数据库级别上不相关,而是在代码中关联。

我应该在一些表中插入和更新新的值,但是,由于设计不好,我正在处理的表没有显式的主键,而是使用id列,而没有实现唯一性。

代码语言:javascript
复制
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl  |2016
3 |Prince|2016
4 |Deo   |2016
---------------

id是通过每次插入的代码填充的,而不是自动递增的。该函数计算当前Max()并将其递增1。

每年,我们都要注册病人,包括前一年的病人仍然是present.Up,到现在为止,这是通过用户的应用程序完成的,这很麻烦,也没有增加任何附加值。

因此,每年都会创建同一个病人的新记录,从而产生重复的id。

代码语言:javascript
复制
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl  |2016
3 |Prince|2016
4 |Deo   |2016
0 |Carine|2017
0 |Prince|2017
---------------

我将用新值更新新行id,结果如下:

代码语言:javascript
复制
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl  |2016
3 |Prince|2016
4 |Deo   |2016
5 |Carine|2017
6 |Prince|2017
---------------

然而,在这样做的过程中,我遇到了以下限制:

约束

不能使用的方法:

  • 没有添加到表中的代码更新、重写和触发器。
  • SQL查询命令接口中不允许循环构造。
  • SQL查询命令接口中没有变量声明。

关系数据库管理系统

WebDev 18 - HyperfileSQL

因此,是否有可能通过简单地使用

INSERT INTO ... SELECT FROM...

Sql Fiddle

EN

回答 2

Database Administration用户

发布于 2017-05-19 08:32:27

为什么不也简单地使用select max(id) + 1现有的不安全(并发性)技术呢?

代码语言:javascript
复制
insert into Patients(id, `Name`, `year`)
select 
id + (select max(id) + 1 from Patients),
`Name`, `year`+1 from Patients;

结果在

代码语言:javascript
复制
| id |   Name | year |
|----|--------|------|
|  0 | Carine | 2016 |
|  1 |   Karl | 2016 |
|  2 | Prince | 2016 |
|  3 | Carine | 2017 |
|  4 |   Karl | 2017 |
|  5 | Prince | 2017 |
票数 1
EN

Database Administration用户

发布于 2017-05-16 15:52:04

我应该将许多行复制为新条目(具有不同的年份)并更新ID。

如果If是序列的属性,则可以..。

代码语言:javascript
复制
INSERT INTO mytable (foo, bar, year)  -- id col omitted
SELECT foo, bar, 2017
FROM mytable
WHERE year = 2016;

这将导致新行获得新的in、具有相同的数据并有新的一年。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/173716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档