我继承了一个运行在Webdev18上的设计糟糕的数据库。
大多数表在数据库级别上不相关,而是在代码中关联。
我应该在一些表中插入和更新新的值,但是,由于设计不好,我正在处理的表没有显式的主键,而是使用id列,而没有实现唯一性。
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl |2016
3 |Prince|2016
4 |Deo |2016
---------------id是通过每次插入的代码填充的,而不是自动递增的。该函数计算当前Max()并将其递增1。
每年,我们都要注册病人,包括前一年的病人仍然是present.Up,到现在为止,这是通过用户的应用程序完成的,这很麻烦,也没有增加任何附加值。
因此,每年都会创建同一个病人的新记录,从而产生重复的id。
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl |2016
3 |Prince|2016
4 |Deo |2016
0 |Carine|2017
0 |Prince|2017
---------------我将用新值更新新行id,结果如下:
--------------
id |name|year|
---------------
1 |Carine|2016
2 |Karl |2016
3 |Prince|2016
4 |Deo |2016
5 |Carine|2017
6 |Prince|2017
---------------然而,在这样做的过程中,我遇到了以下限制:
不能使用的方法:
WebDev 18 - HyperfileSQL
因此,是否有可能通过简单地使用
INSERT INTO ... SELECT FROM...。
Sql Fiddle
发布于 2017-05-19 08:32:27
为什么不也简单地使用select max(id) + 1现有的不安全(并发性)技术呢?
insert into Patients(id, `Name`, `year`)
select
id + (select max(id) + 1 from Patients),
`Name`, `year`+1 from Patients;?
结果在
| id | Name | year |
|----|--------|------|
| 0 | Carine | 2016 |
| 1 | Karl | 2016 |
| 2 | Prince | 2016 |
| 3 | Carine | 2017 |
| 4 | Karl | 2017 |
| 5 | Prince | 2017 |发布于 2017-05-16 15:52:04
我应该将许多行复制为新条目(具有不同的年份)并更新ID。
如果If是序列的属性,则可以..。
INSERT INTO mytable (foo, bar, year) -- id col omitted
SELECT foo, bar, 2017
FROM mytable
WHERE year = 2016;这将导致新行获得新的in、具有相同的数据并有新的一年。
https://dba.stackexchange.com/questions/173716
复制相似问题