SQL 规范化数据 INSERT WHERE NOT EXISTS ;关于重复密钥更新
SQL normalized data INSERT WHERE NOT EXISTS ; ON DUPLICATE KEY UPDATE
我正在使用 MySql Workbench 版本 6.3.9 和 mySql 5.6.35。
我有以下 tables:
设备
eID | caochID | eName
教练
教练ID |教练姓名
准备好SQLfiddle http://sqlfiddle.com/#!9/e333d/1
eID 是主键。不同的设备有多个coachID,所以不同的设备会有重复的coachID,但是eID是唯一的,因为它是主键。
需要
我需要在设备 table 中插入一行,如果它不存在的话。如果存在,什么也不做。
网上的各种帖子向我指出了两个选择:
a) 插入...在重复密钥更新时...
b)插入...不存在的地方
问题 我对这两种解决方案都有问题。对于第一个解决方案(ON DUPLICATE KEY UPDATE),查询根据需要插入行但不更新现有行。相反,它会创建一个新条目。对于第二个解决方案(WHERE NOT EXISTS)我得到一个错误:语法错误:'WHERE'(WHERE)在此位置不是有效输入。
sql 查询不需要进行任何连接。我列出了两个 table,以便您可以看到它们之间的关系。我需要的插入查询只会为设备 table.
插入
NOT EXISTS
insert into table2 (....) --- all if not columns ... destination
select ....
from table1 t1 --- source of data to check
where not exists (
select 1
from table2 t2
where t2.col = t1.col --- match source and destination table making sure table1 data is not in table2
)
您可以通过使用 tmp table 并确保当前 table 中不存在相同的记录来插入。添加 limit 1 以确保只插入一条记录。由于 1 和小球存在,下面的查询将不会插入。
INSERT INTO `Equipment` (`c_id`, `eName`)
SELECT * FROM (SELECT '1', 'small ball') tmp
WHERE NOT EXISTS (
SELECT c_id FROM Equipment WHERE `c_id`='1' and `eName` = 'small ball'
) LIMIT 1;
我正在使用 MySql Workbench 版本 6.3.9 和 mySql 5.6.35。
我有以下 tables:
设备
eID | caochID | eName
教练
教练ID |教练姓名
准备好SQLfiddle http://sqlfiddle.com/#!9/e333d/1
eID 是主键。不同的设备有多个coachID,所以不同的设备会有重复的coachID,但是eID是唯一的,因为它是主键。
需要 我需要在设备 table 中插入一行,如果它不存在的话。如果存在,什么也不做。
网上的各种帖子向我指出了两个选择:
a) 插入...在重复密钥更新时...
b)插入...不存在的地方
问题 我对这两种解决方案都有问题。对于第一个解决方案(ON DUPLICATE KEY UPDATE),查询根据需要插入行但不更新现有行。相反,它会创建一个新条目。对于第二个解决方案(WHERE NOT EXISTS)我得到一个错误:语法错误:'WHERE'(WHERE)在此位置不是有效输入。
sql 查询不需要进行任何连接。我列出了两个 table,以便您可以看到它们之间的关系。我需要的插入查询只会为设备 table.
插入NOT EXISTS
insert into table2 (....) --- all if not columns ... destination
select ....
from table1 t1 --- source of data to check
where not exists (
select 1
from table2 t2
where t2.col = t1.col --- match source and destination table making sure table1 data is not in table2
)
您可以通过使用 tmp table 并确保当前 table 中不存在相同的记录来插入。添加 limit 1 以确保只插入一条记录。由于 1 和小球存在,下面的查询将不会插入。
INSERT INTO `Equipment` (`c_id`, `eName`)
SELECT * FROM (SELECT '1', 'small ball') tmp
WHERE NOT EXISTS (
SELECT c_id FROM Equipment WHERE `c_id`='1' and `eName` = 'small ball'
) LIMIT 1;