mysql通过一次更改复制许多记录

时间:2017-12-29 00:02:28

标签: mysql

这是表Evact:

+--------------+-----------------------+------+-----+---------+-------+
| Field        | Type                  | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+-------+
| EvActMas     | char(10)              | NO   | PRI |         |       |
| EvActSub     | char(10)              | NO   | PRI |         |       |
| EvActCode    | char(10)              | NO   | PRI |         |       |
| EvActIncOutg | enum('I','O','B','N') | YES  |     | NULL    |       |
| EvActBudAct  | enum('B','A','O')     | YES  |     | NULL    |       |
    ...other columns ...

以下是一些记录:

EvActMas    EvActSub    EvActCode   EvActIncOutg    EvActBudAct ..other..

Bank-2017   Incoming    mth01       I              A
Bank-2017   Incoming    mth02       I              A
Bank-2017   Incoming    mth03       I              A
Bank-2017   Incoming    mth04       I              A
Bank-2017   Incoming    mth05       I              A
Bank-2017   Incoming    mth06       I              A

我想在表格中添加六条新记录,其中包含' Incoming'改为' Outgoing'和'我'改为' O'

我通过从旧的表创建一个新表来艰难地做到了;更新新表,然后插回Evact:

Create table btemp like Evact;
update btemp set Evact = 'Outgoing', EvActIncOutg = 'O';
insert into Evact select * from btemp;

这很有用,但我想在SQL上做得更好。我希望通过某种方式将Evact加入到自身中,从而一步到位。有没有人有建议?

1 个答案:

答案 0 :(得分:1)

如果要插入一堆作为现有行的部分副本的行:

INSERT INTO evact 
SELECT evactmas, 'Outgoing', evactcode, 'O', evactbudact, ...other..
FROM evact

您创建一个Select语句,该语句是您要插入的数据,select中的某些列是原样的值,其他列是新值

如果你没有指定select中的所有列,你必须在INTO之后将列名列表放在括号中,以便MySQL知道哪些列可以获取哪些数据。如果您的选择查询在表中选择相同数量的列,则只能省略列列表(在这种情况下,所选列的顺序必须与要插入的表列的顺序相同)

如果您的表具有计算的主键(例如自动增量),则指定要插入的值为0或NULL以使MySQL为其计算新值,或者在INTO之后命名除了该列之外的所有列并省略它从选择列表