这是表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加入到自身中,从而一步到位。有没有人有建议?
答案 0 :(得分:1)
如果要插入一堆作为现有行的部分副本的行:
INSERT INTO evact
SELECT evactmas, 'Outgoing', evactcode, 'O', evactbudact, ...other..
FROM evact
您创建一个Select语句,该语句是您要插入的数据,select中的某些列是原样的值,其他列是新值
如果你没有指定select中的所有列,你必须在INTO之后将列名列表放在括号中,以便MySQL知道哪些列可以获取哪些数据。如果您的选择查询在表中选择相同数量的列,则只能省略列列表(在这种情况下,所选列的顺序必须与要插入的表列的顺序相同)
如果您的表具有计算的主键(例如自动增量),则指定要插入的值为0或NULL以使MySQL为其计算新值,或者在INTO之后命名除了该列之外的所有列并省略它从选择列表