如何插入 table 一个新行然后如果已经存在则什么都不做(没有 UNIQUE 键)
How to insert into table a new row then do nothing if already exists(without UNIQUE key)
假设我有这两个 table。我将来自 staging
table.
的员工插入 employee
table
分期table:
id
employee_id
name
1
12
Paul
2
13
Kyle
员工table
id
employee_id
name
5
4
Will
6
13
Kyle
现在,在员工 table 上,假设我想复制当前 table 上的内容,使用 INSERT SELECT INTO
语句,将插入 Paul,但我不不希望插入 Kyle,因为他已经在员工 table 上了(employee.employee_id 是定义列)。
我知道这可以通过在 employee_id
上设置一个唯一键或主键来完成,然后只使用语句 ON DUPLICATE KEY UPDATE
然后什么也不做,只需将它们设置回它们的原始值。
我是 SQL 的新手,我一直坚持设置 UNIQUE
键和 ON DUPLICATE KEY UPDATE
语句的解决方案,但我想知道该怎么做这没有我提到的那个解决方案?
首先,您应该记住,是否创建唯一键或主键的决定不取决于如何创建插入语句等。这是您的 table 应该做什么和不应该做什么的问题。
为了实现您的目标,您可以在插入语句中添加一个排除已存在条目的位置,例如:
INSERT INTO employees (id, employee_id, name)
SELECT id, employee_id, name
FROM staging
WHERE employee_id NOT IN (SELECT employee_id FROM employees)
将问题分解成多个组成部分
- 获取暂存 table 但不在目标 table
中的员工列表
- 只插入那些记录
第 1 部分可以通过左连接和目标 table 为空的 Where 条件来实现。将其打包为 CTE,然后在 2)
中使用它
假设我有这两个 table。我将来自 staging
table.
employee
table
分期table:
id | employee_id | name |
---|---|---|
1 | 12 | Paul |
2 | 13 | Kyle |
员工table
id | employee_id | name |
---|---|---|
5 | 4 | Will |
6 | 13 | Kyle |
现在,在员工 table 上,假设我想复制当前 table 上的内容,使用 INSERT SELECT INTO
语句,将插入 Paul,但我不不希望插入 Kyle,因为他已经在员工 table 上了(employee.employee_id 是定义列)。
我知道这可以通过在 employee_id
上设置一个唯一键或主键来完成,然后只使用语句 ON DUPLICATE KEY UPDATE
然后什么也不做,只需将它们设置回它们的原始值。
我是 SQL 的新手,我一直坚持设置 UNIQUE
键和 ON DUPLICATE KEY UPDATE
语句的解决方案,但我想知道该怎么做这没有我提到的那个解决方案?
首先,您应该记住,是否创建唯一键或主键的决定不取决于如何创建插入语句等。这是您的 table 应该做什么和不应该做什么的问题。 为了实现您的目标,您可以在插入语句中添加一个排除已存在条目的位置,例如:
INSERT INTO employees (id, employee_id, name)
SELECT id, employee_id, name
FROM staging
WHERE employee_id NOT IN (SELECT employee_id FROM employees)
将问题分解成多个组成部分
- 获取暂存 table 但不在目标 table 中的员工列表
- 只插入那些记录
第 1 部分可以通过左连接和目标 table 为空的 Where 条件来实现。将其打包为 CTE,然后在 2)
中使用它